我正在制作一个纯客户端web app,它显示用户的Google日历中的一些信息。他们通过OAuth,授予访问日历的权限,然后查看派生的信息。在Google Calendar JS Quickstart之后,我得到了这个基本工作。
问题是,访问令牌的有效期仅为1小时(3599秒)。在此之后,我需要再次向用户发送整个OAuth流以获取新令牌,即在三个屏幕上单击四次。有没有办法避免每次都不得不要求新的同意?
我正在制作一个纯客户端web app,它显示用户的Google日历中的一些信息。他们通过OAuth,授予访问日历的权限,然后查看派生的信息。在Google Calendar JS Quickstart之后,我得到了这个基本工作。
问题是,访问令牌的有效期仅为1小时(3599秒)。在此之后,我需要再次向用户发送整个OAuth流以获取新令牌,即在三个屏幕上单击四次。有没有办法避免每次都不得不要求新的同意?
3条答案
按热度按时间cnjp1d6j1#
如果您可以获取refresh token,那么您可以定期使用它来创建新的访问令牌,并且它应该可以工作长达六个月。然而,由于额外功能,刷新令牌需要客户端身份验证,客户端(即您的应用程序)必须提供客户端ID和客户端机密,授权服务器可以更仔细地检查并在客户端受到危害时撤销客户端。
然而,在这种情况下,您不能在您的客户端(如Web客户端)代码中包含客户端(如OAuth客户端)秘密;您共享了网页,并且网页的源代码很容易看到。(隐含地,人们更担心浏览器内的令牌可能会被攻击者窃取,因此降低这种令牌本身的威力是有意义的。)因此,谷歌的库甚至不提供从基于浏览器的Java脚本库请求刷新令牌的能力。该流程使用“隐式授权”,其中客户端未经过身份验证,用户只需遵循其用户代理中的重定向,这种方式更简单,但有一些安全限制,因此Google和其他公司通常只打算将其用于用户当前正在使用页面的当前会话应用程序。
如果您启动一个小型服务器(并使用Google的服务器端库之一),您可以获取并安全地存储刷新令牌,并根据需要获取新更新的访问令牌,每次使用您的ID/密码从服务器发出更新请求。
还有一些流可以让客户端应用程序获得更长时间的刷新令牌,方法是让单独设备上的用户转到单独的URL并输入代码,我相信这仍然允许客户端(您的应用程序)进行身份验证(因为您正在运行一个额外的小型服务来处理这一问题,并可以使用客户端机密)。但我不知道谷歌的OAuth2设置是否支持这一点。
0yg35tkg2#
部分解决方案:
1.存储用户是否已经同意,存储在本地存储或任何地方
1.仅对未经同意的用户使用
tokenClient.requestAccessToken({prompt: 'consent'});
;否则使用tokenClient.requestAccessToken({prompt: ''});
用户仍然需要再次通过OAuth流程,但现在他们需要做的不是被提示同意,而是选择他们的谷歌账户。点击两次而不是四次。
不过,让它保持开放状态,以防有办法让它降到只需点击一次或零次。
uurv41yg3#
您不需要再次通过OAuth过程发送用户。
如果您查看https://developers.google.com/identity/protocols/oauth2/javascript-implicit-flow#creatingclient,您将看到有一个选项“Prompt=None”。
通过使用这一点,谷歌将向用户提供一个看不见的新访问令牌。如果您直接调用原始OAuth端点,只需每隔50分钟从IFRAME调用它一次,您的用户永远不会注意到它。或者,Google JS库应该为您处理iFrame。就我个人而言,我不使用JS库,因为它不稳定且源代码封闭。