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

Wat*_* v2 31 oauth google-api google-oauth google-oauth2

对于OAuth服务器授予的离线访问,"离线"一词到底意味着什么?

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

DaI*_*mTo 34

离线访问是IMO一个非常糟糕的名称,我认为这个术语只有谷歌使用它不在RFC中为Oauth记住.

什么是谷歌离线访问?

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

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

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

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

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

文档的东西

如果授权代码交换中存在刷新令牌,则可以随时使用它来获取新的访问令牌.这称为脱机访问,因为当应用程序获取新的访问令牌时,用户不必出现在浏览器中.

离线访问的真相

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

示例:您可以使用以下说明对Google 3有腿的Oauth流程进行测试

但只是张贴

https://accounts.google.com/o/oauth2/token code = {AuthCode}&client_id = {ClientId} .apps.googleusercontent.com&client_secret = {ClientSecret}&redirect_uri = urn: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"
}
Run Code Online (Sandbox Code Playgroud)

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

  • 您做出了一些不正确的陈述。仅当您在形成授权提示时包含参数 access_type=offline 时,才会返回刷新令牌。不需要刷新令牌来避免询问用户授权,因为如果他们之前已授予访问权限,则每当您再次呈现时,批准对话框将立即关闭。 (2认同)

Eri*_*eda 7

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

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

对于Google API,您可以通过在您向用户提供的授权网址中包含参数access_type = offline来请求离线访问.使用已安装的应用程序流时,将自动请求脱机访问,从而刷新令牌.

  • 啊,似乎在使用已安装的应用程序流程时,refresh_tokens [自动提供](https://developers.google.com/identity/protocols/OAuth2InstalledApp#formingtheurl)。我已经更新了我的答案以刷新这个边缘情况。 (2认同)
  • 好的,那么为什么 Google 不告诉人们他们也授予您的应用程序离线访问权限呢?我使用 Erics 很棒的应用程序授予其访问我的 Google 驱动器的权限 身份验证屏幕显示授予 Erics 很棒的应用程序访问您的驱动器的权限 我授予它。埃里克(Eric)出色的应用程序现在可以随时读取我的所有文件。不仅仅是当我运行 Awesome 应用程序时 (2认同)