OAuth 中的 "offline" 访问权限是什么意思?

What does "offline" access in OAuth mean?

对于 OAuth 服务器授予的离线访问权限,"offline" 一词的确切含义是什么?

是否意味着资源服务器将return有关用户的数据,即使当用户退出第三方应用程序或当用户退出OAuth资源服务器如Facebook时或 Google 或推特?

离线访问在我看来是一个非常糟糕的名字,我认为它只是一个术语 据我所知,Google 在 OAuth 的 RFC 中没有使用它。

什么是 Google 离线访问

当您请求离线访问时,Google身份验证服务器return是一个 refresh token。刷新令牌使您的应用程序能够 当用户不在场时代表用户请求数据 你的申请。

需要离线访问的应用示例

假设我有一个 Super Awesome 应用程序可以下载您的 Google 分析数据, 把它做成一个漂亮的 PDF 文件,每天早上用你的电子邮件发给你 统计数据。为此,我的应用程序需要能够访问 当你不在时你的 Google 分析数据,允许我做 那。所以 Super Awesome 应用会请求 离线访问 并且 身份验证服务器将 return 一个 刷新令牌 。使用那个刷新令牌 超级棒的应用程序可以随时请求新的访问令牌并获得您的 Google 分析数据。

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

让我们试试 Less Awesome 应用程序,它可以让您将文件上传到 Google 云端硬盘。较少的 很棒的应用程序不需要在您不在时访问您的 Google 驱动器帐户 大约。它只需要在您 在线 时访问它。所以理论上它 不需要离线访问。但实际上它确实如此,它仍然会得到 刷新 token 这样它就不必再次请求您的许可(这是我的地方 认为命名不正确)。

来自 OpenStack 的有用引用 documentation:

If a refresh token is present in the authorization code exchange, then it can be used to obtain new access tokens at any time. This is called offline access, because the user does not have to be present at the browser when the application obtains a new access token.


关于离线访问的真相

事实是,在很多情况下,身份验证服务器将 return 刷新令牌给你无论如何:你不必实际要求任何东西 – 它给了你。让您能够在用户访问时访问他们的数据 不在身边。用户不知道您可以在没有他们的情况下访问他们的数据 在那里。这只是 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 条腿 OAuth2 流程.


有用的阅读

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

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

对于 Google API,您可以通过在向用户提供的授权 URL 中包含参数 access_type=offline 来请求离线访问。使用 Installed Application flow.

时会自动请求离线访问,因此会自动请求刷新令牌