[英]Spotify Authorization Code Flow returns incomplete response
I have a django server, and I wish to perform the spotify Authorization code flow. 我有一台django服务器,我希望执行Spotify授权代码流程。
Here is a basic skeleton I have created: 这是我创建的基本骨架:
spotify/login
url. spotify/login
URL。 SpotifyLoginView
redirects them to https://accounts.spotify.com/authorize
url. SpotifyLoginView
将它们重定向到https://accounts.spotify.com/authorize
网址。 spotify/callback
endpoint. spotify/callback
端点。 SpotifyCallbackView
makes a POST request to https://accounts.spotify.com/api/token
to get the auth token. SpotifyCallbackView
向https://accounts.spotify.com/api/token
发出POST请求以获取身份验证令牌。 urlpatterns = [
path(
"spotify/callback", views.SpotifyCallbackView.as_view(), name="spotify callback"
),
path("spotify/login", views.SpotifyLoginView.as_view(), name="spotify login"),
]
def build_authorize_url(request):
params = {
"client_id": "<my client id>",
"response_type": "code",
"redirect_uri": request.build_absolute_uri(
reverse("spotify callback")
),
"scope": " ".join(
[
"user-library-read",
"user-top-read",
"user-read-recently-played",
"playlist-read-private",
]
),
}
print(params)
url = (
furl("https://accounts.spotify.com/authorize")
.add(params)
.url
)
print(url)
return url
AUTH_HEADER = {
"Authorization": "Basic "
+ base64.b64encode(
"<my client id>:<my client secret>".encode()
).decode()
}
def handle_callback(request):
code = request.GET["code"]
response = requests.post(
"https://accounts.spotify.com/api/token",
data={
"grant_type": "client_credentials",
"code": code,
"redirect_uri": request.build_absolute_uri(
reverse("spotify callback")
),
},
headers=AUTH_HEADER,
)
return response.json()
class SpotifyLoginView(RedirectView):
query_string = True
def get_redirect_url(self, *args, **kwargs):
return build_authorize_url(self.request)
class SpotifyCallbackView(TemplateView):
template_name = "success.html"
def get(self, request, *args, **kwargs):
print(spotify.handle_callback(request))
return super().get(request, *args, **kwargs)
However, the response returned by spotify doesn't contain the scope
and refresh_token
! 但是,spotify返回的响应不包含
scope
和refresh_token
!
So for these params: 因此,对于这些参数:
{'client_id': '<my client id>', 'response_type': 'code', 'redirect_uri': 'http://127.0.0.1:8000/spotify/callback', 'scope': 'user-library-read user-top-read user-read-recently-played playlist-read-private'}
which translate to this url: 转换为以下网址:
https://accounts.spotify.com/authorize?client_id=<my client id>&response_type=code&redirect_uri=http%3A%2F%2F127.0.0.1%3A8000%2Fspotify%2Fcallback&scope=user-library-read+user-top-read+user-read-recently-played+playlist-read-private
All I get back is: 我得到的是:
{'access_token': '<my acess token>', 'token_type': 'Bearer', 'expires_in': 3600, 'scope': ''}
While the docs suggest that I should get this: 虽然文档建议我应该得到这个:
{
"access_token": "NgCXRK...MzYjw",
"token_type": "Bearer",
"scope": "user-read-private user-read-email",
"expires_in": 3600,
"refresh_token": "NgAagA...Um_SHo"
}
Furthermore, If I try using that access token, I get a 401
HTTP error back. 此外,如果尝试使用该访问令牌,
401
返回401
HTTP错误。
$ curl -H "Authorization: Bearer <my acess token>" https://api.spotify.com/v1/me
{
"error" : {
"status" : 401,
"message" : "Unauthorized."
}
}
What's going on here? 这里发生了什么?
You have to use "authorization_code" as grant_type
when making POST request to https://accounts.spotify.com/api/token in order to get an initial access token. 向https://accounts.spotify.com/api/token发出POST请求时,必须使用“ authorization_code”作为
grant_type
以获得初始访问令牌。 In your handle_callback()
method: 在您的
handle_callback()
方法中:
response = requests.post(
"https://accounts.spotify.com/api/token",
data={
"grant_type": "authorization_code",
"code": code,
"redirect_uri": request.build_absolute_uri(
reverse("spotify callback")
),
},
headers=AUTH_HEADER,
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.