access_type = online oauth模式(无刷新令牌)应该如何工作?

时间:2018-08-08 17:49:28

标签: google-oauth google-oauth2

此问题与上一个问题Google OAuth: can't get refresh token with authorization code有很多共同点(如果被认为是重复的,我不会感到冒犯),但有一些区别:该问题使用Javascript和PHP库,并且我都不用。这个问题想知道如何获取刷新令牌,并且我想知道我是否应该想要刷新令牌,或者没有刷新令牌的模式是如何工作的。

我正在遵循本指南:

https://developers.google.com/identity/protocols/OAuth2WebServer

目标是允许用户将文件从Google云端硬盘上传到我的网络应用程序。

我没有使用Google最受欢迎的编程语言之一,所以我没有一个库来抽象与Google的所有交互。我需要知道HTTP请求的实际外观。

授权请求中的参数之一是access_type。描述说

  

如果在用户不在浏览器中时您的应用程序需要刷新访问令牌,则将该值设置为离线

我不需要这样做(我只想在用户选择文件后立即在服务器上检索文件),因此本着不要求超出您实际需要的特权的精神,我使用了{{ 1}}。这给了我一个访问令牌,没有刷新令牌。我已经成功使用访问令牌向Google云端硬盘发出了一些请求。

用户第二天回来,尝试上载另一个文件。在处理用户的请求时,我向Google云端硬盘提出了请求。访问令牌已过期,因此我得到401。接下来应该怎么办?

我的猜测是,我应该假装这是一个全新的用户,然后再次通过完整的授权过程将其发送。这意味着我必须中止用户要尝试执行的所有操作,使用所有参数(access_type=onlinehttps://accounts.google.com/o/oauth2/auth等)将它们重定向到scope并将足够的信息嵌入{ {1}}参数,当用户绕道而行时,我可以恢复原始请求。

这似乎相当困难(特别是关于在任意点保存和恢复我的应用程序状态的部分)。这是一个很大的障碍,应该在某个地方进行解释。但是client_id参数的描述并没有说明需要在任何地方插入授权重定向。它只是说用户必须“在场”。

1 个答案:

答案 0 :(得分:1)

您正在使用正确的实现。如果您不打算在用户不使用应用程序时发出请求,则不需要脱机访问。问题是访问令牌会在1小时内过期。因此,如果用户离开应用程序并稍后返回,则需要生成新的访问令牌。

如果用户已授权您的应用程序,则使用您的配置调用此URL应返回一个新的有效访问令牌:

https://accounts.google.com/o/oauth2/v2/auth?
 scope=scopes&
 include_granted_scopes=true&
 state=state_parameter_passthrough_value&
 redirect_uri=http://oauth2.example.com/callback&
 response_type=token&
 client_id=client_id