Spotipy使用授权代码流刷新令牌

时间:2018-03-12 15:57:30

标签: python authorization refresh spotipy

我有一个使用spotipy的长时间运行的脚本。一小时后(根据Spotify API),我的访问令牌到期。我成功地抓住了这个,但我不知道从哪里开始真正刷新令牌。我正在使用授权代码流,而不是客户端凭据。以下是我的授权方式:

token = util.prompt_for_user_token(username,scope=scopes,client_id=client_id,client_secret=client_secret, redirect_uri=redirect_uri)

sp = spotipy.Spotify(auth=token)

我见过的所有刷新示例都涉及一个oauth2对象(例如oauth.refresh_access_token()),并且文档仅列出该函数作为刷新令牌的方法。我的理解是,使用授权代码流程,您不需要oauth对象(因为您使用prompt_for_user_token()进行身份验证)。如果是这种情况,我该如何刷新令牌?

1 个答案:

答案 0 :(得分:4)

my github issue上未收到任何回复后,我觉得在没有使用OAuth2的情况下无法刷新令牌。这违反了the Spotipy docs中所述的内容:

  

授权代码流程:此方法适用于用户登录一次的长时间运行的应用程序。 它提供了一个可以刷新的访问令牌。

他们的授权代码流示例使用prompt_for_user_token()。

我切换到了OAuth方法,这很痛苦,因为每次运行程序时都需要重新授权(在我测试时真的只是一个问题,但仍然存在问题)。由于Spotipy文档中没有OAuth2的示例,我将在此处粘贴我的。

sp_oauth = oauth2.SpotifyOAuth(client_id=client_id,client_secret=client_secret,redirect_uri=redirect_uri,scope=scopes)
token_info = sp_oauth.get_cached_token() 
if not token_info:
    auth_url = sp_oauth.get_authorize_url(show_dialog=True)
    print(auth_url)
    response = input('Paste the above link into your browser, then paste the redirect url here: ')

    code = sp_oauth.parse_response_code(response)
    token_info = sp_oauth.get_access_token(code)

    token = token_info['access_token']

sp = spotipy.Spotify(auth=token)

要刷新我的令牌(每小时需要),我使用此功能。你何时何地调用它取决于你的程序。

def refresh():
    global token_info, sp

    if sp_oauth.is_token_expired(token_info):
        token_info = sp_oauth.refresh_access_token(token_info['refresh_token'])
        token = token_info['access_token']
        sp = spotipy.Spotify(auth=token)