【发布时间】:2015-03-14 01:02:40
【问题描述】:
我有一个客户端 (SPA)/服务器 (REST) 应用程序,我需要对客户端进行身份验证并让它们在资源服务器中保持登录状态。 应用程序通常必须使用位于第三方授权服务器上的外部 OAuth2 服务。 现在的问题是:refresh_token 应该存储在哪里?我有两个想法。
我故意省略了 refresh_token 过期的情况。
假设
- 始终返回有效令牌以响应对任何安全资源的请求和登录请求。
- 与授权服务器的所有通信都必须通过资源服务器,因为需要 client_id 和 client_secret。
第一个场景
- 服务器存储由令牌映射的refresh_token,并将令牌发送给客户端以响应登录请求。
- 客户端使用令牌发出请求。
- 服务器检查令牌是否有效。如果不是,它使用与令牌关联的 refresh_token 来生成一个新令牌。现在一分钟(或任何配置的持续时间)旧令牌被映射到新令牌,新令牌被映射到 refresh_token 以使用旧令牌处理排队请求。
- 客户端使用令牌发出请求。
- 服务器检查令牌是否有效。如果不是,则检查令牌是否映射到新令牌。如果是这样,它的行为就像使用新令牌发送请求一样(参见步骤 3)。否则发送 401。
第二种情况
- 服务器将令牌和 refresh_token 发送到客户端,以响应登录请求。
- 客户端使用令牌发出请求。
- 服务器检查令牌是否有效。如果不是,它会以 401 响应。
- 如果客户端使用 401 状态的响应,它会尝试刷新令牌并使用新令牌发出相同的请求。
我知道这两种解决方案都有其弱点。有没有适用于这个问题的好的做法?
【问题讨论】:
标签: javascript security rest oauth