关于OAuth服务器授予的离线访问,"offline"这个词究竟意味着什么?
它是否意味着,即使用户已从第三方应用或OAuth资源服务器(如Facebook、Google或Twitter)注销,资源服务器仍会返回有关用户的数据?
关于OAuth服务器授予的离线访问,"offline"这个词究竟意味着什么?
它是否意味着,即使用户已从第三方应用或OAuth资源服务器(如Facebook、Google或Twitter)注销,资源服务器仍会返回有关用户的数据?
“离线访问”这个名字我认为非常不好,我想这只是谷歌使用的术语,据我所记,它并没有在OAuth的RFC中出现。
当您请求“离线访问”时,谷歌认证服务器会返回刷新令牌。刷新令牌使您的应用程序能够代表用户请求数据,即使用户不在您的应用程序前面也可以进行。
假设我有一个超级棒的应用程序,它可以下载您的Google Analytics数据,将其制作成漂亮的PDF文件,并每天早上通过电子邮件发送给您的统计数据。为了使此功能正常工作,我的应用程序需要在您不在场时访问您的Google Analytics数据,以获得权限。因此,超级棒的应用程序将请求“离线访问”,认证服务器将返回一个“刷新令牌”。借助该“刷新令牌”,超级棒的应用程序可以随时请求新的访问令牌并获取您的Google Analytics数据。
让我们尝试Less Awesome应用程序,它允许您将文件上传到Google Drive。当您不在场时,Less Awesome应用程序不需要访问您的Google驱动器帐户。它只需要在您在线时访问它。因此理论上它不需要离线访问。但实际上它仍然获得了一个刷新令牌,这样它就不必再次请求您的权限(这就是我认为名称不正确的地方)。
如果授权代码交换中存在刷新令牌,则可以随时使用它来获取新的访问令牌。这被称为离线访问,因为用户在应用程序获取新的访问令牌时无需出现在浏览器中。
事实上,在很多情况下,认证服务器将无论如何都会向您返回刷新令牌: 您不必实际请求任何内容-它会自动给您。这使您能够在用户不在场时访问其数据。用户不知道您可以在没有他们的情况下访问他们的数据。只有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 三脚架 OAuth2 流程。
access_type=offline
给Google,但我仍然没有被要求获得离线访问权限。 - Qasim按照设计,OAuth流程返回的访问令牌会在一段时间后过期(Google访问令牌为1小时),作为一种安全机制。这意味着,任何想要使用用户数据的应用程序都需要用户最近进行过OAuth流程,也就是在线。请求离线访问将为应用程序提供一个刷新令牌,它可以用于生成新的访问令牌,使其能够在用户数据经过OAuth流程之后长时间访问用户数据,也就是当他们离线时。
当您的应用程序在用户不在场时继续运行时,需要获取离线访问权限。例如,如果有一些夜间批处理过程,或者如果您的应用程序响应外部事件,如推送通知。但是,如果您只在用户积极使用您的应用程序时访问用户数据,则无需获得离线访问权限。每次需要访问令牌时,只需将用户通过OAuth流程发送一次即可,如果他们以前授予了对您的应用程序的访问权限,则授权页面将立即关闭,使该过程对用户几乎不可见。
对于Google API,您可以在向用户呈现的授权URL中包括参数access_type=offline来请求离线访问权限。在使用已安装应用程序流程时,会自动请求离线访问权限和刷新令牌。