OAuth中的“离线”访问是什么意思?

时间:2015-06-04 07:50:13

标签: oauth google-api google-oauth google-oauth2

关于OAuth服务器授予的离线访问权限,“离线”一词究竟是什么意思?

是否意味着即使用户退出第三方应用程序或用户退出OAuth资源服务器(如Facebook,Google或Twitter),资源服务器也会返回有关用户的数据? / p>

2 个答案:

答案 0 :(得分:31)

离线访问是IMO的一个非常糟糕的名称,我认为它只是一个术语,据我所记,谷歌使用的不是用于Oauth的RFC。

什么是Google离线访问?

当您请求离线访问时,Google身份验证服务器会返回Refresh-Token。刷新令牌使您的应用程序能够在用户不在场时和应用程序前代表用户请求数据。

需要离线访问的应用示例:

假设我有一个超级真棒应用程序,可以下载您的Google Analytics数据,将其制作成精美的PDF文件,并每天早上通过您的统计信息发送给您。为此,我的应用程序需要能够在您不在的时候访问您的Google Analytics数据,以允许我这样做。因此,Super Awesome应用程序将请求脱机访问,并且身份验证服务器将返回具有该刷新令牌的刷新令牌。超级棒的应用程序可以在需要时请求新的访问令牌并获取您的Google Analytics数据。

不需要离线访问的应用示例

让我们试试不那么棒的应用,让您将文件上传到Google云端硬盘。当您不在时,不太棒的应用程序不需要访问您的Google云端硬盘帐户。它只需要在线时访问它。所以理论上它不需要离线访问。但实际上它确实如此,它仍然会获得刷新令牌,因此它不必再次请求您的许可,这是我认为命名不正确的地方。

文档stuff

  

如果授权代码交换中存在刷新令牌,那么   它可以随时用于获取新的访问令牌。这就是所谓的   离线访问,因为用户不必出现在   应用程序获取新访问令牌时的浏览器。

离线访问的真相

问题在于,在很多情况下,无论您不必实际要求提供给您的任何内容,身份验证服务器都会将刷新令牌返回给您。当您不在时,为您提供访问用户数据的能力。用户不知道您可以在没有他们的情况下访问那些数据。 (它只是javascript库,我认为PHP库隐藏了RefreshToken,但它在那里)

示例:您可以使用以下说明Google 3 legged Oauth flow

对此进行测试

但只是张贴

  

https://accounts.google.com/o/oauth2/token   代码= {校验码}&安培; CLIENT_ID = {客户端Id} .apps.googleusercontent.com&安培; client_secret = {ClientSecret}&安培; REDIRECT_URI =瓮:IETF:WG:OAuth的:2.0:OOB&安培; grant_type = authorization_code

响应:

{
"access_token" : "ya29.1.AADtN_VSBMC2Ga2lhxsTKjVQ_ROco8VbD6h01aj4PcKHLm6qvHbNtn-_BIzXMw",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/J-3zPA8XR1o_cXebV9sDKn_f5MTqaFhKFxH-3PUPiJ4"
}

我现在可以离线访问这些用户数据了,我从来没有告诉他们我会拥有它。

答案 1 :(得分:7)

根据设计,OAuth流程返回的访问令牌会在一段时间(Google访问令牌为1小时)后作为安全机制过期。这意味着任何想要使用用户数据的应用程序都需要用户最近通过OAuth流程,即在线。请求离线访问为应用程序提供了一个刷新令牌,可用于生成新的访问令牌,允许它在数据通过OAuth流程后很长时间内访问用户数据,即离线时。

当用户不在场时,您的应用程序继续运行时需要离线访问。例如,如果有一些夜间批处理过程,或者您的应用程序响应推送通知等外部事件。但是,如果您只在用户主动使用应用程序时访问用户数据,则无需离线访问。只需在每次需要n访问令牌时通过OAuth流发送用户,如果他们之前已授予对您的应用程序的访问权限,则授权页面将立即关闭,从而使该过程对用户几乎不可见。

对于Google API,您可以通过在您向用户提供的授权网址中包含参数access_type = offline来请求离线访问。使用Installed Application flow时会自动请求脱机访问,从而刷新令牌。