【问题标题】:How to make a valid access token invalid如何使有效的访问令牌无效
【发布时间】:2016-03-11 18:56:44
【问题描述】:

在安静的应用程序中,对于一些要求,例如在客户端,同一用户只能同时使用一个访问令牌,并且用户可以通过登录成功获得新的访问令牌。如果登录两次,用户将获得两个不同的访问令牌,即访问令牌A和B。后端,当用户仍然使用令牌A与服务器通信时,它应该是无效的,后者应该是有效的!如何实现这个不使用缓存框架或db? 另外在后端,我不想存储任何访问令牌,访问令牌包含简单的用户信息和时间戳等,这是一个用 aes 加密并用 Base64 编码的字符串。

【问题讨论】:

    标签: rest access-token


    【解决方案1】:

    很遗憾,如果没有持久化令牌,您将无法做自己想做的事。

    answered 之前有一个与基于令牌的身份验证相关的问题。或许你可以从there那里得到一些启发。

    不同类型的令牌

    基本上,令牌可以是不透明的(除了值本身之外不显示任何细节,如随机字符串)或者可以是自包含的(如 JSON Web 令牌)。

    • 随机字符串:可以通过生成随机字符串并将其保存到具有到期日期和与之关联的用户标识符的数据库中来颁发令牌。

    • JSON Web Token (JWT):由RFC 7519 定义,它是在两方之间安全地表示声明的标准方法。 JWT 是一个自包含的令牌,使您能够将用户标识符、到期日期和任何您想要的(但不要在其上存储密码)存储在有效负载中,即JSON编码为Base64。客户端可以读取有效负载,并且可以通过在服务器上验证其签名来轻松检查令牌的完整性。如果您不需要跟踪 JWT 令牌,则无需保留它们。尽管如此,通过持久化令牌,您将有可能使它们失效并撤销它们的访问权限。要找到一些与 JWT 合作的重要资源,请查看 http://jwt.io

    持久化令牌

    您可以在many databases 中保留您的令牌。根据您的要求,您可以探索不同的解决方案,例如relational databaseskey-value storesdocument stores

    请记住删除旧令牌以防止您的数据库无限增长;-)

    【讨论】:

    • 几天后,似乎没有更好的解决方案..我必须接受你的回答吗? +_+ 问题之前我尝试过了解jwt,但是好像有点复杂..
    • @user2262920 希望我的回答对你有用。如果它回答了你的问题,你可以考虑接受它:)
    【解决方案2】:

    必须在 Authorization 标头中的每个请求中发送访问令牌。对于每个用户,您都存储他的访问令牌。所以访问令牌到达,您检查它的值并找到它是哪个用户。如果你没有找到访问令牌,用户没有被授权。

    所以基本上当你生成新令牌时,你会替换给定用户的旧访问令牌,当旧访问令牌出现时你无法识别它(它没有存储在任何地方),因此它是无效的。

    【讨论】:

    • 感谢您的回复!我再次编辑了我的问题,我不想在后端存储任何令牌..
    • @user2262920 - 如果您不存储任何令牌或有关用户的信息,则无法对其进行身份验证。
    • @user2262920 - 好吧,例如,您可以将访问令牌中的信息与 RSA 捆绑在一起,但您无法控制它(如果它来了,它来了,失效等不是可能)
    猜你喜欢
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2020-09-11
    • 2020-01-26
    • 2019-03-13
    • 2017-09-07
    • 2019-02-09
    • 1970-01-01
    相关资源
    最近更新 更多