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

时间:2018-12-01 04:50:33

标签: python django spotify

这是我向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'}

3 个答案:

答案 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()

这也有效。