OAuth 中的“离线”访问是啥意思?
Posted
技术标签:
【中文标题】OAuth 中的“离线”访问是啥意思?【英文标题】:What does "offline" access in OAuth mean?OAuth 中的“离线”访问是什么意思? 【发布时间】:2015-08-18 17:15:26 【问题描述】:对于 OAuth 服务器授予的离线访问权限,“离线”一词究竟是什么意思?
这是否意味着即使用户退出第三方应用程序或用户退出 Facebook、Google 或 Twitter 等 OAuth 资源服务器时,资源服务器也会返回有关用户的数据?
【问题讨论】:
在什么情况下使用该术语?因为我在任何一个 OAuth RFC 中都找不到对它的引用。你能引用一句话吗? developers.google.com/identity/protocols/… developers.facebook.com/docs/roadmap/completed-changes/… 【参考方案1】:离线访问是 IMO 的一个非常糟糕的名字,我认为它只是一个术语 据我所知,谷歌在 OAuth 的 RFC 中没有使用它。
什么是谷歌离线访问?
当您请求离线访问时,Google 身份验证服务器会返回一个 refresh token。刷新令牌使您的应用程序能够 当用户不在场时代表用户请求数据 你的申请。
需要离线访问的应用示例
假设我有一个 Super Awesome 应用,可以下载您的 Google Analytics(分析)数据, 把它变成一个漂亮的 PDF 文件,每天早上用你的电子邮件发送给你 统计数据。为此,我的应用程序需要能够访问 当你不在时你的谷歌分析数据,允许我做 那。所以 Super Awesome 应用会请求 离线访问 并且 身份验证服务器将返回一个刷新令牌。使用那个刷新令牌 超级棒的应用程序可以随时请求新的访问令牌并获取您的 谷歌分析数据。
不需要离线访问的应用示例
让我们试试 Less Awesome 应用,它可以让您将文件上传到 Google 云端硬盘。较少的 真棒应用不需要访问您的 Google 云端硬盘帐户 大约。它只需要在您在线时访问它。所以理论上它 不需要离线访问。但实际上它确实如此,它仍然会获得 refresh 令牌,这样它就不必再次请求您的许可(这是我 认为命名不正确)。
来自 OpenStack 的有用引用 documentation:
如果授权码交换中存在刷新令牌,那么它 可用于随时获取新的访问令牌。这就是所谓的 离线访问,因为用户不必出现在浏览器中 当应用程序获得一个新的访问令牌。
离线访问的真相
问题是,在很多情况下,身份验证服务器会返回 无论如何给你刷新令牌:你不必实际要求任何东西 - 它给了你。使您能够在用户访问时访问他们的数据 不在身边。用户不知道您可以在没有他们的情况下访问他们的数据 在那里。它只是 javascript 库,我认为是 php 库 向您隐藏 刷新令牌,但它就在那里。
示例
只需发布(即 HTTP POST 请求):
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"
我现在可以离线访问此用户数据,而且我从未告诉他们我 会的。更多详情请参阅这篇短文:Google 3 legged OAuth2 flow。
有用的阅读
Using OAuth 2.0 for Web Server Applications Understanding Refresh Tokens【讨论】:
属性/标志名称在您解释时有点意思,但它非常令人困惑(听起来像是与文件同步有关的东西) 您做了许多不正确的陈述。只有在形成授权提示时包含参数 access_type=offline 时才会返回刷新令牌。不需要刷新令牌来避免向用户询问授权,因为如果他们之前已授予访问权限,那么只要您再次提交,审批对话框就会立即关闭。 @EricKoleda 该信息仍然是最新的吗?我将 GET 字符串中的access_type=offline
传递给 Google,但我仍然没有被要求提供离线访问权限。
尝试添加 prompt=consent
所有的名字都不好。授权服务器执行身份验证【参考方案2】:
作为一种安全机制,OAuth 流返回的访问令牌会在一段时间(Google 访问令牌为 1 小时)后过期。这意味着任何想要处理用户数据的应用程序都需要用户最近通过 OAuth 流程,也就是在线。请求离线访问会为应用程序提供一个刷新令牌,它可以使用它来生成新的访问令牌,从而允许它在数据通过 OAuth 流程很长时间后访问用户数据,也就是离线时。
当您的应用程序在用户不存在的情况下继续运行时,需要获得离线访问权限。例如,如果有一些夜间批处理,或者如果您的应用程序响应诸如推送通知之类的外部事件。但是,如果您仅在用户积极使用您的应用程序时访问用户数据,则无需离线访问。每次您需要 n 个访问令牌时,只需通过 OAuth 流程向用户发送,如果他们之前已授予对您的应用程序的访问权限,则授权页面将立即关闭,从而使该过程对用户几乎不可见。
对于 Google API,您可以通过在向用户提供的授权 URL 中包含参数 access_type=offline 来请求离线访问。使用Installed Application flow 时会自动请求脱机访问并因此刷新令牌。
【讨论】:
任何意见为什么即使您的应用程序以后不需要能够访问它,谷歌总是返回一个刷新令牌?你不必提供 access_type=offline 无论如何你都会得到一个刷新令牌检查我的链接我已经测试过了。因此,如果我请求 Google Analytics 访问权限,范围会告诉用户我想访问那里的数据,但不会告诉他们我也有离线访问权限。 只有当 access_type=offline 位于您将用户重定向到的 授权 URL 中时,才会返回刷新令牌。您显示的 URL 是令牌 URL,您的应用程序会在后台发出请求。您可以在OAuth2 playground中测试线下和线上流程,使用齿轮图标更改访问类型,禁用强制批准提示等。 自己手动拨打电话daimto.com/google-3-legged-oauth2-flow 我认为 Oauth2 操场以某种方式对其进行了调整。如果您使用本机客户端 ID 直接与身份验证服务器对话,您将始终获得刷新令牌。我没有使用网络令牌示例accounts.google.com/o/oauth2/tokencode=4/X9lG6uWd8-MMJPElWggHZRzyFKtp.QubAT_P-GEwePvB8fYmgkJzntDnaiAI&client_id=ClientId.apps.googleusercontent.com&client_secret=ClientSecret&redirect_uri=urn:ietf:wg:oauth:2.0 对其进行测试:oob&grant_type=authorization_code 啊,使用已安装的应用程序流时,好像refresh_tokens are provided automatically。我已经更新了我的答案以刷新这个边缘案例。 好的 那么为什么 Google 不告诉人们他们也授予您的应用程序离线访问权限?我使用 Eric 的真棒应用程序授予它访问我的 Google 驱动器身份验证屏幕的权限说授予 Erics 真棒应用程序访问您的驱动器我授予它。 Eric 很棒的应用程序现在可以随时读取我的所有文件。不只是在我运行 Awesome 应用程序时以上是关于OAuth 中的“离线”访问是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
当我或其他用户尝试使用 OAuth2 进行授权时,我不断收到需要验证我的应用程序的错误。那是啥意思?