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

Posted

技术标签:

【中文标题】“TypeError:在 OAuth 2.0 回调请求期间需要一个类似字节的对象,而不是 \'str\'”【英文标题】:"TypeError: a bytes-like object is required, not 'str'" during OAuth 2.0 callback request“TypeError:在 OAuth 2.0 回调请求期间需要一个类似字节的对象,而不是 'str'” 【发布时间】:2019-05-11 22:21:14 【问题描述】:

我是 Python 3 和 Flask 的新手,我目前正在构建一个简单的 Web 应用程序来使用来自 Spotify API 的数据。

OAuth 2.0 身份验证流程几乎可以正常工作,因为我可以调用 https://accounts.spotify.com/authorizehttps://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】:

因为python3字符串是unicode,所以在传递给在字节级别操作的东西(比如base64编码)之前需要进行编码:

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

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

【讨论】:

以上是关于“TypeError:在 OAuth 2.0 回调请求期间需要一个类似字节的对象,而不是 'str'”的主要内容,如果未能解决你的问题,请参考以下文章