【发布时间】:2016-12-20 19:23:50
【问题描述】:
我正在为个人项目创建一个 API 和一个 SPA,我在以下用于验证用户身份的解决方案之间犹豫不决(注意:通过 HTTPS):
- HTTP 基本身份验证(发送每个请求的用户名/密码)
- 基于令牌的身份验证(将经过 SHA1 的用户令牌存储在数据库中)
- JSON Web 令牌 (JWT) 身份验证
我什至不考虑 OAuth,因为它看起来真的很痛苦,而且我不需要使用其他应用进行身份验证,我只关心对用户进行身份验证。
据我所知,JWT 似乎是一个不断发展的标准。它基本上保存了调用者的数据,因此每次他使用encrypt(base64(header) + "." + base64(payload)) 向您发出 API 请求时,您都将其与令牌本身最后一部分中提供的签名进行比较。它避免了执行数据库事务。
问题是,如果我使用 JWT 1),我无法手动撤销特定令牌,最重要的是 2)如果我更改用户的权限,先前授予的 JWT 仍将拥有具有旧权限的旧数据,只要他没有获得具有新权限的新令牌,就可以授予/限制他对某些数据的连续访问,即真的有问题,我很惊讶我还没有看到有人提到这个问题。此外,3) JWT 声称允许服务器在无需访问数据库的情况下验证访问权限,但我无法想象任何不涉及数据库的 API 请求,即使只是为了向用户返回数据要求。所以这个论点对我来说没有任何意义。
对我来说,我现在最好的选择是选项 2。网站的流量有限且流量较小,因此将令牌存储在数据库中似乎是一个小而值得的权衡,并允许我对这些令牌做任何我想做的事情,包括管理它们的生命周期和权限。它还可以避免像选项 1 那样暴露用户的凭据,以防他们将相同的凭据用于其他在线服务。
我只是想知道我对 JWT 的担忧是否正确,或者我是否误解了它的功能?此外,即使我已经阅读了很多关于这些不同选项的内容,请随意链接任何可以启发我并帮助我做出更好选择的内容。谢谢。
【问题讨论】:
标签: authentication authorization jwt access-token api-design