Spotify API从redirect_uri获取授权代码

时间:2018-12-10 12:50:35

标签: python python-3.x oauth-2.0 spotify api-design

我正在尝试获得我的应用程序和Spotify帐户的授权。不需要每个用户都在应用程序中使用该功能。因为还没有应用程序。只想先尝试一些事情。现在,我意识到出现混乱的情况,我可能应该使用该库。首先,我只是尝试按照以下说明将链接粘贴到浏览器中。第一步工作正常。但是,当我尝试用令牌交换身份验证代码时,总是会遇到错误。我想也许验证码的生命周期很短,而将验证码粘贴到新链接中总是为时已晚。

因此,问题是:我可以在执行GET请求后以某种方式获取出现在redirect_uri中的代码,然后将其作为参数之一传递给POST请求。

spotify的指南-https://developer.spotify.com/documentation/general/guides/authorization-guide/#authorizaton-code-flow

import requests
import config
import secrets
import string


URL_AUTH = 'https://accounts.spotify.com/authorize'
URL_TOKEN = 'https://accounts.spotify.com/api/token'
symbols = string.ascii_lowercase + string.digits
STATE = ''.join(secrets.choice(symbols) for _ in range(12))

params_auth = {
                'client_id': config.CLIENT_ID,
                'response_type': 'code',
                'redirect_uri': 'https://example.com/callback',
                'scope': 'user-read-currently-playing',
                'state': STATE
}

data_token = {
                'grant_type': "authorization_code",
                # how can I get the auth code 'code': auth_code,
                'redirect_uri': 'https://example.com/callback',
                'client_id': config.CLIENT_ID,
                'client_secret': config.CLIENT_SECRET
}

app_auth = requests.get(url=URL_AUTH, params=params_auth)

access_token = requests.post(url=URL_TOKEN, data=data_token)

2 个答案:

答案 0 :(得分:0)

https://accounts.spotify.com/authorize不是您的程序要发送请求的地址。您打算在网络浏览器中打开此页面,以供用户登录并授予您的应用程序权限以代表他们执行操作。用户完成操作并接受或拒绝您的应用程序的许可请求后,他们将被重定向到重定向网址,您将在其中收到授权码,您可以在其中进行身份验证和刷新令牌的交换在您的第二个请求中。

整个授权代码流已记录在here中。值得一提的是,“隐式授予”流程也更简单一些,并且可能适合您的目的。

Spotipy具有针对这些身份验证流内置的方法,因此您可能会发现使用该库更容易。

答案 1 :(得分:0)

您应该尝试对授权进行编码,并将其作为标头传递。

在分配的重定向页面上,您可以从URL中捕获代码,并将其传递给将打印令牌的函数,如下所示:

def get_current_profile_token(code):
        basic = self.client_id + ':' + self.client_secret        
        basic = base64.b64encode(basic.encode('ascii'))

        response = requests.post(
            url = 'https://accounts.spotify.com/api/token',            
            data={
                'grant_type': 'authorization_code',
                'code': code,
                'redirect_uri': self.redirect_url,
                'scope': self.redirect_url,
            },
            headers={
                "Authorization": "Basic " + basic.decode('ascii'),
            },
            verify=True            
        )
        
        print(response.json())
        return response.ok