«TypeError: требуется байтоподобный объект, а не str» во время запроса обратного вызова OAuth 2.0 - PullRequest
0 голосов
/ 11 декабря 2018

Я довольно новичок в Python 3 и Flask, и в настоящее время я создаю простое веб-приложение для использования данных из Spotify API.

Поток аутентификации OAuth 2.0 почти работает, так как явозможность звонить https://accounts.spotify.com/authorize и 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))        
headers = {"Authorization": "Basic {}".format(encoded_oauth2_tokens)}
post_request = requests.post(SPOTIFY_TOKEN_URL, data=code_payload, headers=headers)  

Обратный звонокФункция запроса завершается с ошибкой:

File "app.py", line 52, in callback
            encoded_oauth2_tokens = base64.b64encode('{}:{}'.format(CLIENT_ID, CLIENT_SECRET))
          File "/usr/lib/python3.6/base64.py", line 58, in b64encode
            encoded = binascii.b2a_base64(s, newline=False)
        TypeError: a bytes-like object is required, not 'str' 

Я понимаю, что строка передается в b64encode(), но я не уверен, как я могу изменить ее на двоичный (?).

Во время моего исследования большинство подобных ошибок были связаны с открытием файлов, и это не мой сценарий.

1 Ответ

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

Поскольку строки python3 являются Unicode, их необходимо кодировать перед передачей в объекты, работающие на уровне байтов (например, кодирование base64):

base64.b64encode('{}:{}'.format(CLIENT_ID, CLIENT_SECRET).encode())

Кодировка по умолчанию - UTF-8, котораядолжно быть достаточно для OAuth.Метод encode принимает аргумент, указывающий, какую кодировку использовать, если это необходимо для вашего приложения: "foo".encode("latin-1")

...