Authentication 基于令牌的身份验证的替代方法

Authentication 基于令牌的身份验证的替代方法,authentication,token,restful-authentication,Authentication,Token,Restful Authentication,我有一个RESTful API,用户将通过一组web/移动客户端访问该API,我正试图找出如何处理令牌身份验证。我的理解是,传统令牌身份验证的工作原理如下: 用户通过提供User/pass进行身份验证,接收回令牌并过期 直到,令牌随每个请求一起传递 到期时,请求一个新令牌(通过提供单独的“刷新”令牌或仅通过用户/通行证重新验证) 是否有充分的理由不在每个请求中生成新令牌?即:通过user/pass请求初始令牌。此令牌随第一个API请求一起传递,该请求返回API响应的内容以及必须随以下请求一起传递

我有一个RESTful API,用户将通过一组web/移动客户端访问该API,我正试图找出如何处理令牌身份验证。我的理解是,传统令牌身份验证的工作原理如下:

  • 用户通过提供User/pass进行身份验证,接收回令牌并过期
  • 直到,令牌随每个请求一起传递
  • 到期时,请求一个新令牌(通过提供单独的“刷新”令牌或仅通过用户/通行证重新验证)
  • 是否有充分的理由不在每个请求中生成新令牌?即:通过user/pass请求初始令牌。此令牌随第一个API请求一起传递,该请求返回API响应的内容以及必须随以下请求一起传递的新令牌。。。这种方法的优点是,用户的每个请求(操作)都会“重置”令牌身份验证的到期时间,这样令牌到期时间基本上就变成了用户可以在不注销的情况下处于非活动状态的时间段。有没有充分的理由不使用这种方法?上面列出的方法似乎更常见(这就是为什么我要问)


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

    从我了解到的是,您需要一个滑动窗口,其中用户经过身份验证。到期窗口内的每个新请求都会延长会话。 如果我理解正确,我会建议另一种方法;每次请求成功通过身份验证时,请更新您拥有令牌的存储并更新过期时间。 这样,您就不必每次都为获取新令牌而烦恼用户。 所以,是的,有一个很好的理由不这样做:这对于您的用例来说是不必要的,只会让用户感到烦恼

    使用上述方法,我假设您有一个存储(数据库),其中保存您的令牌+过期日期

    所以过程是这样的:

  • 用户提供用户名+密码
  • 在存储中创建记录
  • 给用户令牌
  • 每次成功请求时更新存储
  • 相关说明;不要给用户提供过期日期。例如,当使用cookies时,这很好,但这仅仅是一种额外的安全措施


    关于你的一个稍微相关的问题;如果不使用TLS/SSL/HTTPS,没有任何东西可以阻止任何人获取令牌。始终使用TLS(即SSL,即HTTPS,或多或少)。

    我使用的是python及其危险的TimedJSONWebSignatureSerializer(JSON Web签名实现)。所以不,我不认为我在使用数据库来存储令牌。由于过期是令牌的一部分,您不能扩展它(您将获得一个新令牌)。澄清:API的“用户”是我自己(最终用户不打算直接使用API,只使用其中一个客户端应用程序)。因此,我主要关注这种方法的安全影响。另外,“标准”模型中过期的原因是,客户端可以知道何时请求新令牌,而不必访问资源,由于身份验证失败(令牌过期)而被拒绝,然后请求新令牌。这有意义吗?显然,对于滑动的auth窗口,这是不必要的(这也是为什么它看起来是个好主意的部分原因!)将过期信息发送给客户端确实可以传递关于何时请求新令牌的信息。但它不应该以客户可以更改的方式使用。在JWT的情况下,这是无法做到的,这确实是一种替代方法。由于您是API的唯一用户,因此如何处理过期令牌当然取决于您。无论如何,你都需要做点什么。但是,定期请求新令牌会更容易吗。保持一切都很好和分开。