2017-02-10 96 views
1

我有一个RESTful API,这将是用户将通过一组Web /移动客户端达到,我想弄清楚如何处理令牌身份验证。我的理解是,传统的令牌身份验证的工作原理如下:基于令牌的身份验证的替代方法

  1. 用户auths中通过提供用户名/密码,接收回令牌和到期
  2. ,直到令牌传递的每个请求
  3. 到期后,新的请求令牌(通过提供单独的“刷新”令牌或仅通过用户/通过重新认证)

是否有一个很好的理由不为每个请求生成新的令牌?即:通过用户/密码请求初始令牌。该令牌与第一个API请求一起传递,该请求返回api响应的内容以及必须通过以下请求传递的新令牌...此方法的优点是每个请求(操作)重置'令牌auth的到期,使得令牌到期时间基本上变成用户可以不注销而不活动的时间段。有没有一个很好的理由不使用这种方法?上面列出的方法似乎更常见(这就是为什么我问)。

最后,只有一个稍微相关的问题。阻止正在观看网络的人从用户那里获取令牌?特别是在第一种方案中,似乎很容易做到(在第二种方法中,您需要捕获传入的请求,然后在用户执行操作之前快速获取下一个令牌)。

回答

1

从我读到的是,你想要一个滑动窗口,其中用户进行身份验证。到期窗口内的每个新请求都会延长会话。 如果我理解正确,我会建议一种替代方法;每次请求成功通过身份验证时,都会更新您拥有令牌的商店并更新到期时间。 这样你就不必费心使用每一次抓取新令牌的麻烦。 所以,是的,有一个很好的理由不这样做:它不是必需的,只会让用户恼火。

通过上述方法,我假设您有一个商店(数据库),您在其中保留您的代币+过期日期。

所以整个过程是这样的:

  1. 用户提供用户名+密码
  2. 在商店创建记录
  3. 每一个成功的请求时
  4. 时间给用户令牌
  5. 更新商店

在相关说明上;不要给用户过期日期。例如,使用cookie时很好,但这仅仅是一种附加的安全措施。

在你稍微相关的问题;如果您不使用TLS/SSL/HTTPS,则无法阻止任何人抓取令牌。始终使用TLS(即SSL,即HTTPS,或多或少)。

+0

我正在使用python w/itsdangerous TimedJSONWebSignatureSerializer(一个JSON Web签名实现)。所以不,我不认为我正在使用数据库来存储令牌。并且因为过期是令牌的一部分,所以不能扩展它(您会得到一个新令牌)。澄清:API的'用户'是我自己的(最终用户不打算直接使用API​​,只使用其中一个客户端应用程序)。所以我最关心的是这种方法对安全性的影响。 – guywhoneedsahand

+0

此外,“标准”模型中到期的原因是,客户可以知道何时请求新的令牌而不必击中资源,由于认证失败(令牌过期)而被拒绝,然后请求新鲜令牌。那有意义吗?很显然,在滑动认证窗口中,这不是必需的(这也是为什么它看起来像个好主意!) – guywhoneedsahand

+0

将过期发送给客户端的确可以传达关于何时请求新令牌的信息。但不应该以客户可以改变它的方式使用它。 在JWT无法完成的情况下,这确实是一种替代方法。 由于您是API的唯一用户,因此您当然应该如何处理即将到期的令牌。无论如何你都需要做点什么。但是定期请求新令牌会更容易吗?保持一切美好和分离。 – harm

相关问题