KeyError: 'access_token' during OAuth 2.0 authentication using Spotify API
KeyError: 'access_token' during OAuth 2.0 authentication using Spotify API
我正在构建一个简单的应用程序来学习 Python 3 和 Flask。目标是使用来自 Spotify API 的数据,为此我需要使用 OAuth 2.0 进行身份验证。
我可以向 Spotify 帐户提供我的凭据,但是在回调期间发生以下错误:
File "app.py", line 59, in callback
access_token = response_data["access_token"]
KeyError: 'access_token'
代码示例:
post_request = requests.post(SPOTIFY_TOKEN_URL, data=code_payload, headers=headers)
response_data = json.loads(post_request.text)
access_token = response_data["access_token"]
token_type = response_data["token_type"]
expires_in = response_data["expires_in"]
refresh_token = response_data["refresh_token"]
这是来自 API documentation 的请求响应示例:
{
"access_token": "NgCXRK...MzYjw",
"token_type": "Bearer",
"scope": "user-read-private user-read-email",
"expires_in": 3600,
"refresh_token": "NgAagA...Um_SHo"
}
我迷路了。不确定它是否与 API 响应内容相关或应用程序如何使用 json.loads(post_request.text).
解析它
编辑:在获得 HTTP 状态代码后,我可以对问题有所了解:
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://accounts.spotify.com/api/token
但是我仍然无法弄清楚我的请求有什么问题:
authentication_token = request.args['code']
code_payload = {
"grant_type": "authorization_code",
"code": str(authentication_token),
"redirect_uri": REDIRECT_URI
}
encoded_oauth2_tokens = base64.b64encode('{}:{}'.format(CLIENT_ID, CLIENT_SECRET).encode())
headers = {"Authorization": "Basic {}".format(encoded_oauth2_tokens)}
post_request = requests.post(SPOTIFY_TOKEN_URL, data=code_payload, headers=headers)
post_request.raise_for_status()
您确定您确实从 Spotify Web API 获取数据而不是错误响应吗?
这是我用的,效果很好
@dataclass
class Tokens:
access: str
refresh: str
expires_at: int
# Class that sets up authorization_headers
# Class method
def get_tokens(self, code_from_redirect_uri: str) -> bool:
payload: dict = {'redirect_uri': self._redirect_uri, 'code': code_from_redirect_uri,
'grant_type': 'authorization_code', 'scope': self._scope}
response: Response = post(OAUTH_TOKEN_URL, data=payload, headers=self.authorization_headers)
# When we don't get the OK response - we assume code was bad
if response.status_code != 200:
return False
token_info: dict = response.json()
self.tokens = Tokens(token_info['access_token'], token_info['refresh_token'], token_info['expires_in']*1000 + time())
return True
我正在构建一个简单的应用程序来学习 Python 3 和 Flask。目标是使用来自 Spotify API 的数据,为此我需要使用 OAuth 2.0 进行身份验证。
我可以向 Spotify 帐户提供我的凭据,但是在回调期间发生以下错误:
File "app.py", line 59, in callback
access_token = response_data["access_token"]
KeyError: 'access_token'
代码示例:
post_request = requests.post(SPOTIFY_TOKEN_URL, data=code_payload, headers=headers)
response_data = json.loads(post_request.text)
access_token = response_data["access_token"]
token_type = response_data["token_type"]
expires_in = response_data["expires_in"]
refresh_token = response_data["refresh_token"]
这是来自 API documentation 的请求响应示例:
{
"access_token": "NgCXRK...MzYjw",
"token_type": "Bearer",
"scope": "user-read-private user-read-email",
"expires_in": 3600,
"refresh_token": "NgAagA...Um_SHo"
}
我迷路了。不确定它是否与 API 响应内容相关或应用程序如何使用 json.loads(post_request.text).
解析它编辑:在获得 HTTP 状态代码后,我可以对问题有所了解:
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://accounts.spotify.com/api/token
但是我仍然无法弄清楚我的请求有什么问题:
authentication_token = request.args['code']
code_payload = {
"grant_type": "authorization_code",
"code": str(authentication_token),
"redirect_uri": REDIRECT_URI
}
encoded_oauth2_tokens = base64.b64encode('{}:{}'.format(CLIENT_ID, CLIENT_SECRET).encode())
headers = {"Authorization": "Basic {}".format(encoded_oauth2_tokens)}
post_request = requests.post(SPOTIFY_TOKEN_URL, data=code_payload, headers=headers)
post_request.raise_for_status()
您确定您确实从 Spotify Web API 获取数据而不是错误响应吗?
这是我用的,效果很好
@dataclass
class Tokens:
access: str
refresh: str
expires_at: int
# Class that sets up authorization_headers
# Class method
def get_tokens(self, code_from_redirect_uri: str) -> bool:
payload: dict = {'redirect_uri': self._redirect_uri, 'code': code_from_redirect_uri,
'grant_type': 'authorization_code', 'scope': self._scope}
response: Response = post(OAUTH_TOKEN_URL, data=payload, headers=self.authorization_headers)
# When we don't get the OK response - we assume code was bad
if response.status_code != 200:
return False
token_info: dict = response.json()
self.tokens = Tokens(token_info['access_token'], token_info['refresh_token'], token_info['expires_in']*1000 + time())
return True