离线访问是 IMO 的一个非常糟糕的名字,我认为它只是一个术语
据我所知,谷歌在 OAuth 的 RFC 中没有使用它。
什么是谷歌离线访问?
当您请求离线访问时,Google 身份验证服务器会返回一个
refresh token。刷新令牌使您的应用程序能够
当用户不在场时代表用户请求数据
你的申请。
需要离线访问的应用示例
假设我有一个 Super Awesome 应用,可以下载您的 Google Analytics(分析)数据,
把它变成一个漂亮的 PDF 文件,每天早上用你的电子邮件发送给你
统计数据。为此,我的应用程序需要能够访问
当你不在时你的谷歌分析数据,允许我做
那。所以 Super Awesome 应用会请求 离线访问 并且
身份验证服务器将返回一个刷新令牌。使用那个刷新令牌
超级棒的应用程序可以随时请求新的访问令牌并获取您的
谷歌分析数据。
不需要离线访问的应用示例
让我们试试 Less Awesome 应用,它可以让您将文件上传到 Google 云端硬盘。较少的
真棒应用不需要访问您的 Google 云端硬盘帐户
大约。它只需要在您在线时访问它。所以理论上它
不需要离线访问。但实际上它确实如此,它仍然会获得 refresh
令牌,这样它就不必再次请求您的许可(这是我
认为命名不正确)。
如果授权码交换中存在刷新令牌,那么它
可用于随时获取新的访问令牌。这就是所谓的
离线访问,因为用户不必出现在浏览器中
当应用程序获得一个新的访问令牌。
离线访问的真相
问题是,在很多情况下,身份验证服务器会返回
无论如何给你刷新令牌:你不必实际要求任何东西 -
它给了你。使您能够在用户访问时访问他们的数据
不在身边。用户不知道您可以在没有他们的情况下访问他们的数据
在那里。它只是 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。
有用的阅读