【问题标题】:How can I make my authentication token work with safety?如何使我的身份验证令牌安全地工作?
【发布时间】:2020-08-20 08:58:33
【问题描述】:

我正在使用 React-Native/PHP/MySQL 制作一个身份验证系统,您可以在其中执行以下步骤:

  1. 用户登录:用户输入他的用户名和密码,在数据库中生成一个令牌,他的有效期为 5 分钟

  2. 操作:如果用户想要执行除 LOGOUT 之外的任何操作,则会向 API 发送一个 POST 请求,其中包含操作和令牌

  3. Check Token:检查token是否有效(DB中存在),如果过期则更新过期时间, 执行操作

我有一些问题:

  1. 如果令牌重复?它是一个 64 个字符的标记,但它应该始终能够被复制
  2. 如果有人出于某种原因获得了此令牌,则该人可以在用户的​​帐户中执行多项操作。所以我在考虑更新 令牌生成另一个过期案例,这是最好的方法吗?

这是令牌认证系统的最佳方式吗?

【问题讨论】:

  • 为什么要允许令牌复制?
  • 我可以用一个 SELECT 语句说明数据库中是否生成了令牌吗?

标签: php react-native authentication token


【解决方案1】:

如果你想快速克服它,这不是你想做的有趣的事情,而是你需要集成到你的项目中的事情,那么我会选择 OAuth 或一些类似的包,它已经存在.

否则:

  1. 最好确保您的令牌是唯一的。您可以将表格的字段设置为唯一,因此当您尝试保存它但它存在时,您会收到错误,您可以生成另一个错误。(1)或者您可以创建一个算法来确保该令牌不存在于数据库中。为此,您可以使用时间戳,也可以使用用户 ID 作为令牌哈希算法。

例如:

$token = md5(uniqid(mt_rand(), true));

为什么不让令牌被复制是好的?

如果您的数据库中有用户,则管理员和客户端通常存储在同一个用户表中。它们之间的区别是一个角色字段,它定义了他们是客人、客户、管理员、nazguls、摄魂怪等。

假设一个管理员得到了一个令牌(123),后来另一个用户得到了 - 也许客户端会得到相同的令牌(123)。在这种情况下,如果您检查 API 端点的权限,对于请求,您必须将 userID 与令牌一起存储,并且在权限检查期间您还必须添加额外的条件来检查 userID,否则客户端可能会获得管理员令牌,并通过它获得对管理员端点/功能的访问权限。

如果您没有在旧令牌过期后立即清除它们,那么在权限检查期间检查器将返回过期令牌,因此用户将获得权限被拒绝。

所以没有必要,但更简单。

  1. 对于令牌到期,您有 3 个选项。这些是:
    • 短期访问令牌和长期刷新令牌
    • 短期访问令牌和无刷新令牌
    • 未过期的访问令牌

您可以阅读更多关于他们的信息here

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 2017-04-27
    • 2010-09-27
    • 1970-01-01
    • 2011-08-22
    • 2011-06-08
    • 1970-01-01
    • 2010-10-24
    • 2013-08-19
    相关资源
    最近更新 更多