如何自动登录到Google API以获取OAuth 2.0令牌以访问已知用户帐户

18

好的,这个问题之前已经在这里提过了。在问题的回答中,用户告诉他将refresh_token存储在应用程序中(会话而不是数据库,尽管您可以将其存储在任何地方都可以)。在查看了谷歌文档后,发现access_token在到期后就不再有效。现在,我们可以每隔固定时间自动刷新令牌,或者如果服务返回无效的令牌错误,则刷新令牌,从而延长令牌的使用寿命。但由于某种原因,这个手动过程感觉有点粗糙。我的问题是:

  • 对于已知的用户帐户,访问Google日历/应用数据的最有效(/通常接受)方式是否是手动登录并将令牌持久化到应用程序中?还是有另一种机制允许我们编程登录到此用户帐户并执行OAuth步骤?
1个回答

26
在我的应用程序中,流程如下:
  1. 如果没有定义access_token,则将用户重定向到 Google 页面,让他们授权您的应用程序访问其 Google 数据。这会返回授权代码给您的应用程序。
  2. 使用授权代码获取一个 access_token 和一个 refresh_token。您也应该保存返回的 expires_in 值,它告诉您何时 access_token 过期并且不能再使用。
  3. 每当您需要访问 API 时,可以检查您的数据库中的 access_token 是否已过期-如果是,则在访问 API 之前使用 refresh_token 获取新的 access_token
我以这种方式做过,并没有遇到任何问题-就用户而言,他们只需要授权一次,然后应用程序自动处理身份验证。
这样就解决了您的问题,因为应用程序根据用户最初授权您的应用程序来重新进行身份验证,您不需要手动执行任何操作。实际上,我不确定还有其他方法可以完成此操作,因为要重新进行 OAuth 过程,必须让用户坐在设备前手动授权访问。这就是在数据库中持久保存 access_tokenrefresh_token 的意义所在。

@mattewh,你能帮我解决这个问题吗?https://dev59.com/oWAf5IYBdhLWcg3wOQcL - Marco Alves
3
如果必须要有非自动化的用户交互。 - Keith Tyler
@KeithTyler OAuth 至少需要用户同意一次,之后不需要进一步的交互。 - Mohyaddin Alaoddin
问题在于,刷新令牌也会过期,所以有一天用户将不得不再次进行交互。 - Pierre de LESPINAY
@PierredeLESPINAY 我不相信这是真的 - 刷新令牌的整个意义在于它们不会过期。Google 对可以授予的刷新令牌数量有一些限制,但现有的刷新令牌不应该过期。 - Matt Healy
实际上这取决于身份验证提供程序的配置,但所有令牌最初都是有过期时间的。虽然RFC刷新令牌部分似乎没有提到任何过期时间,但似乎建议将其设置在大约14天左右。 - Pierre de LESPINAY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接