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

Cha*_*ost 6 python django spotify

这是我向https://accounts.spotify.com/api/token发出 POST 请求的众多尝试之一。

范围设置为“播放列表-修改-公共,播放列表-修改-私有”。

我使用的是 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'}
Run Code Online (Sandbox Code Playgroud)

小智 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()
Run Code Online (Sandbox Code Playgroud)

这也有效。


sol*_*oke 10

我怀疑问题出在Authorization标题中的无效字符。尝试使用urlsafe_b64encode而不是b64encode准备该标头值:

b64_auth_str = base64.urlsafe_b64encode(auth_str.encode()).decode()
Run Code Online (Sandbox Code Playgroud)