这种基于 JWT 的身份验证方法安全吗?
Is this JWT based authentication method safe?
尝试使用 JWT 为 API 实现安全身份验证方法,这将被许多客户端使用,包括 Web(单页应用程序)、桌面、移动我想出了这个系统:
- 客户端调用 /auth/login 并设置了用户名和密码
- 验证服务器 returns 两个令牌后 auth_token 和 refresh_token
- 授权令牌仅存在 15 分钟,并在随后的每个 API 调用中使用
- 刷新令牌的寿命很长,可能会持续 12 小时到一周,但使用格式为 user_pass + long_string
的密钥进行签名
- 令牌过期后调用 /auth/renew
- 发送授权令牌以检查其过期时间(不超过一个小时)
- 同时发送刷新令牌并使用用户密码进行验证
- 如果刷新令牌未过期且授权令牌长时间未过期,则发回新的授权令牌
- 如果用户的密码已更改,则刷新令牌无效,用户需要在其现有的短期授权令牌过期后重新进行身份验证
虽然有一个小 window 验证令牌已过期但仍然有效,并且对数据库进行了调用;这是使用 JWT 进行身份验证以及处理密码更改和令牌刷新的整体安全方式吗?
不要尝试实施您自己的身份验证基础结构。您获得安全实施的机会微乎其微,现在您还必须维护所有这些代码。
最好使用信誉良好的授权服务器,例如 Thinktecture IdentityServer or Azure Active Directory 并使用标准库和协议。
我发现你的提案存在一些问题:
- 如果您不签署访问令牌,是什么阻止我更改
里面的主张?
- 如果您需要用户密码来验证刷新令牌,则必须以可以明文检索的方式存储它。密码应仅存储为加盐哈希,以防止您获得明文。
尝试使用 JWT 为 API 实现安全身份验证方法,这将被许多客户端使用,包括 Web(单页应用程序)、桌面、移动我想出了这个系统:
- 客户端调用 /auth/login 并设置了用户名和密码
- 验证服务器 returns 两个令牌后 auth_token 和 refresh_token
- 授权令牌仅存在 15 分钟,并在随后的每个 API 调用中使用
- 刷新令牌的寿命很长,可能会持续 12 小时到一周,但使用格式为 user_pass + long_string 的密钥进行签名
- 令牌过期后调用 /auth/renew
- 发送授权令牌以检查其过期时间(不超过一个小时)
- 同时发送刷新令牌并使用用户密码进行验证
- 如果刷新令牌未过期且授权令牌长时间未过期,则发回新的授权令牌
- 如果用户的密码已更改,则刷新令牌无效,用户需要在其现有的短期授权令牌过期后重新进行身份验证
虽然有一个小 window 验证令牌已过期但仍然有效,并且对数据库进行了调用;这是使用 JWT 进行身份验证以及处理密码更改和令牌刷新的整体安全方式吗?
不要尝试实施您自己的身份验证基础结构。您获得安全实施的机会微乎其微,现在您还必须维护所有这些代码。
最好使用信誉良好的授权服务器,例如 Thinktecture IdentityServer or Azure Active Directory 并使用标准库和协议。
我发现你的提案存在一些问题:
- 如果您不签署访问令牌,是什么阻止我更改 里面的主张?
- 如果您需要用户密码来验证刷新令牌,则必须以可以明文检索的方式存储它。密码应仅存储为加盐哈希,以防止您获得明文。