这是我向https://accounts.spotify.com/api/token发出POST请求的众多尝试之一。
范围设置为“播放列表修改公共,播放列表修改私有”。
我正在使用Python 3.7,Django 2.1.3
无论我做什么,response_data返回{'error':'invalid_client'}
我尝试了很多事情,包括按照official Spotify documentation将此特定请求的{_3 / 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'}
答案 0 :(得分:2)
我怀疑问题出在您的Authorization
标头中的字符无效。尝试使用urlsafe_b64encode
而非b64encode
来准备标头值:
b64_auth_str = base64.urlsafe_b64encode(auth_str.encode()).decode()
答案 1 :(得分:0)
感谢您的回复@solarissmoke!我发现了问题所在...我在Spotify仪表板上重置了Spotify client_secret,却完全忘记了相应地修改我的代码...我感到很聪明:|
答案 2 :(得分:0)
来自文档
<块引用>另一种发送客户端 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()
这也有效。