OAuth 2.0在哪里安全存储访问令牌以供长期使用

时间:2018-02-11 19:48:40

标签: php oauth-2.0 google-oauth access-token

我正在使用使用OAuth 2.0的API。它'流程是这样的:

  1. 在您的应用程序中,您有一个按钮可将您重定向到授权服务器(在我的情况下是API')。
  2. 您必须登录API'网站并允许访问您的应用程序(按"允许"或"拒绝"按钮)或者如果您已经登录,只需访问您的应用程序(按"允许&# 34;或"拒绝")。
  3. 使用新的访问令牌将您重定向回应用程序以进行API调用。
  4. 一切都适合我,一切都很好,但我不明白的是如何处理给定的访问令牌,以便已经授权访问您的应用程序的用户不必再次访问。等几天后他回到应用程序。它提供了糟糕的用户体验(没有人想要一次又一次地授予访问权限)。

    注意:我正在使用Quizlet API

1 个答案:

答案 0 :(得分:5)

首先,访问令牌应该是短暂的。认为它等于短期一次性凭证。如果您不相信,请检查此处链接的Azure AD令牌生存时间定义"Configurable token lifetime properties"

建议使用定义短期访问令牌,例如在1小时后过期。这样你就可以避免存储它们的复杂性。您只需将它们保存在内存中并使用它们来访问受保护的资源。

  

我不明白的是如何处理给定的访问令牌,以便已经授权访问您的应用程序的用户不必再次提供访问权限。等等几天后回到应用程序

那么,你应该谈论 Refresh tokens 。根据OAuth 2.0规范,它的刷新令牌具有更长的使用寿命。如果您查看我之前对Azure的引用,您会发现它们最多可以使用90天。对于Google,刷新令牌将在6个月后过期(如果未使用)。人们仍然可以撤销它们。

现在,当您使用刷新令牌时,您没有使用它们来访问受保护的资源。应交换刷新令牌以获取访问令牌。因此,如果有人窃取他们,他们仍然需要客户端身份验证(例如: - 客户端ID,重定向uri和客户端密钥)来获取访问令牌。但是,保护它们是必须的。

无论如何,RFC6819定义了您可以在5.3.3部分中存储秘密(令牌是秘密)的一些可能性。您可以使用客户端存储机制或利用支持的服务器来存储令牌。

如果您的应用程序有后端,一种可能性是将Cookie与令牌相关联。 Cookie值可以是您存储在后端(可能在数据库中)的令牌的哈希值。当后端接收到具有有效cookie值的请求时,它可以检索针对它存储的令牌。这非常类似于"记住我"功能。

如果您无法控制令牌的续航时间(默认情况下是长期存在的)会怎样?

如果您可以轻松获得令牌,并且如果您可以牺牲最终用户体验,请选择内存存储,您将始终检索新令牌以便进行全新访问。

如果您的应用程序的后端可以维护客户端之间的状态,则在后端推送和存储令牌。将客户端会话与令牌相关联,可能通过cookie /会话。通过后端调用安全API,而不将存储的令牌暴露给客户端应用程序。