OAuth 2.0回调请求期间,“ TypeError:需要一个类似字节的对象,而不是'str'”

时间:2018-12-10 23:53:37

标签: python-3.x flask oauth-2.0 spotify

我对Python 3和Flask还是很陌生,目前正在构建一个简单的Web应用程序以使用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(),但是我不确定如何将其更改为binary(?)。

在研究期间,大多数类似的错误与打开文件有关,而这不是我的情况。

1 个答案:

答案 0 :(得分:1)

由于python3字符串是unicode,因此在传递给以字节级别进行操作的事物(例如base64编码)之前,需要对其进行编码:

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

默认编码为UTF-8,对于OAuth应该足够了。编码方法接受一个参数,以指定应为您的应用程序使用的编码:"foo".encode("latin-1")