KeyError: 'access_token' во время аутентификации OAuth 2.0 с использованием Spotify API - PullRequest
0 голосов
/ 12 декабря 2018

Я создаю простое приложение для изучения Python 3 и Flask.Цель состоит в том, чтобы использовать данные из API Spotify, и для этого мне нужно пройти аутентификацию с использованием 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 :

{
   "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).

EDIT : после получения кода состояния HTTP I 'Я могу понять проблему:

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()

1 Ответ

0 голосов
/ 12 декабря 2018

Вы уверены, что на самом деле получаете данные из 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...