Spotify API {'error': 'invalid_client'} 授权代码流程 [400]

问题描述 投票:0回答:4

这是我向 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'}
python django spotify
4个回答
14
投票

来自文档

发送客户端 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()

这也有效。


10
投票

我怀疑问题出在您的

Authorization
标题中的无效字符。尝试使用
urlsafe_b64encode
而不是
b64encode
来准备该标头值:

b64_auth_str = base64.urlsafe_b64encode(auth_str.encode()).decode()

2
投票

这里又提到了一个问题。如果错误是

INVALID_CLIENT: Invalid redirect URI

然后你需要注册你的URI。引用来源 - 将所有内容集中在一处:

只需登录,找到您的应用程序,然后单击右上角的“编辑设置”即可。在重定向 URI 下添加 REDIRECT_URI 并记住单击底部的“保存”。这应该可以解决您的问题。


0
投票

您可以做的一件事是通过 Spotify API 仪表板生成新的客户端密钥。我不久前遇到了这个错误,这解决了我的问题。

不要忘记在代码中引用的任何地方反映此更改的客户端密钥。

© www.soinside.com 2019 - 2024. All rights reserved.