Spotify API 从 redirect_uri 获取授权码

Spotify API fetch authorization code from redirect_uri

我正在尝试为我的应用程序和我的 Spotify 帐户获取授权。不需要为每个用户在应用程序内部运行的功能。因为还没有app。只是想先尝试一些事情。现在我知道了 spotipy,我可能应该使用这个库。起初,我只是尝试按照以下说明将 links 粘贴到浏览器中。第一步工作正常。但是当我尝试用令牌交换授权码时,我总是会遇到错误。我在想也许授权代码的生命周期非常短,当我在新的 link.

中粘贴授权代码时总是为时已晚

所以,问题是:我能否在执行 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)

https://accounts.spotify.com/authorize 不是您的程序要向其发出请求的地址。您应该在网络浏览器中打开此页面,以便您的用户登录并授予您的应用程序代表他们做事的权限。一旦用户完成并接受或拒绝了您的应用程序的权限请求,他们将被重定向到重定向 url,您将在此处收到授权代码,您可以使用该代码交换授权令牌和刷新与您在第二个请求中所做的一样。

记录了整个授权代码流程here。还值得看看隐式授权流程,它更简单一些,可能适合您的目的。

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

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

在指定的重定向页面上,您可以从 url 捕获 code 并将其传递给将打印令牌的函数,如下所示:

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