这是我向 https://accounts.spotify.com/api/token 发出 POST 请求的众多尝试之一。
范围设置为“playlist-modify-public、playlist-modify-private”。
我正在使用Python 3.7,Django 2.1.3。
无论我做什么,response_data都会返回{'error': 'invalid_client'}
我已经尝试了很多方法,包括根据此特定请求的官方 Spotify 文档在请求正文中传递 client_id/client_secret...但无济于事。
请帮忙!
def callback(request):
auth_token = request.GET.get('code') # from the URL after user has clicked accept
code_payload = {
'grant_type': 'authorization_code',
'code': str(auth_token),
'redirect_uri': REDIRECT_URI,
}
auth_str = '{}:{}'.format(CLIENT_ID, CLIENT_SECRET)
b64_auth_str = base64.b64encode(auth_str.encode()).decode()
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Basic {}'.format(b64_auth_str)
}
post_request = requests.post(SPOTIFY_TOKEN_URL, data=code_payload, headers=headers)
response_data = json.loads(post_request.text)
# ==> {'error': 'invalid_client'}
来自文档
发送客户端 ID 和密钥的另一种方法是作为 POST 正文中的请求参数(client_id 和 client_secret),而不是在标头中发送 Base64 编码的它们。
SPOTIFY_TOKEN = "https://accounts.spotify.com/api/token"
request_body = {
"grant_type": GRANT_TYPE,
"code": code,
"redirect_uri": REDIRECT_URI,
"client_id": SPOTIFY_CLIENT_ID,
"client_secret": SPOTIFY_CLIENT_SECRET,
}
r = requests.post(url=SPOTIFY_TOKEN, data=request_body)
resp = r.json()
这也有效。
我怀疑问题出在您的
Authorization
标题中的无效字符。尝试使用 urlsafe_b64encode
而不是 b64encode
来准备该标头值:
b64_auth_str = base64.urlsafe_b64encode(auth_str.encode()).decode()
这里又提到了一个问题。如果错误是
INVALID_CLIENT: Invalid redirect URI
然后你需要注册你的URI。引用来源 - 将所有内容集中在一处:
只需登录,找到您的应用程序,然后单击右上角的“编辑设置”即可。在重定向 URI 下添加 REDIRECT_URI 并记住单击底部的“保存”。这应该可以解决您的问题。
您可以做的一件事是通过 Spotify API 仪表板生成新的客户端密钥。我不久前遇到了这个错误,这解决了我的问题。
不要忘记在代码中引用的任何地方反映此更改的客户端密钥。