1

我在 python 应用程序中使用 gspread 来访问一些充当应用程序数据库的后端 Google 表格。用户需要使用应用内浏览器登录应用,并使用通过此方法在 url 中返回的令牌创建 authlib OAuth2 会话。初始登录和访问工作正常,但是当令牌在一小时后超时时,我不再访问工作表并且应用程序中断。

我不知道如何使用 authlib 刷新令牌,我们选择该库的原因是因为它与 gspread 集成,并且它应该为您自动刷新身份验证令牌。我用于登录的代码如下,但一个小时后,gspread 函数open_by_key()由于身份验证问题而失败。

我曾尝试重新创建 gspread 客户端,但这只是使用相同的令牌。我觉得应该有一种方法可以刷新令牌以将其寿命再延长一个小时,但我找不到如何使用 authlib 来做到这一点。

creds = OAuth2Session(clientId, clientSecret, scope=scope, redirect_uri=redirectUrl)
authUrl, state = creds.create_authorization_url('https://accounts.google.com/o/oauth2/v2/auth', response_type='token')

在浏览器中加载authURL并让用户登录。浏览器将身份验证响应返回为urlString

creds.fetch_access_token(authorization_response=urlString)

gc = gspread.Client(None, creds)
ss = gc.open_by_key(sheetKey)
todaysSheetName = datetime.datetime.now().strftime('%d-%m-%Y')
wks = ss.worksheet(todaysSheetName)
4

1 回答 1

2
authUrl, state = creds.create_authorization_url('https://accounts.google.com/o/oauth2/v2/auth', response_type='token')

根据您使用的这段代码,response_type=token是一个隐式授权类型流。我想不会refresh_token有隐式流的 in 令牌。以下是我的建议:

  1. 尝试将其更改为授权码流
  2. 使用数据库保存令牌
  3. 如果令牌已过期,请使用您之前保存的令牌refresh_token来交换新令牌。

refresh_token方法很简单:

refresh_token(url=None, refresh_token=None, body='', auth=None, headers=None, **kwargs)

使用您的代码,它应该是:

refresh_token = your_previous_token.refresh_token
new_token = creds.refresh_token('https://accounts.google.com/...', refresh_token=refresh_token)

问题是这部分没有文档。但根据 API,它会像这样使用。如果它不起作用,您可以将其报告给 Authlib 问题跟踪器。

于 2019-10-09T07:50:44.603 回答