2016-08-14 88 views
1

我创建与个人项目有水疗中心的API,我下面的解决方案之间犹豫来验证用户身份(注:通过HTTPS):约JSON网络令牌安全性和可靠性问题(JWT)

  1. HTTP基本认证(发送用户名/密码至极每个请求)
  2. 基于令牌的认证(在数据库中存储SHA1-ED用户令牌)
  3. JSON网络令牌(JWT)认证

I D甚至不考虑OAuth导致它看起来像一个真正的痛苦,我不需要与其他应用程序进行身份验证,我只关心认证用户。

从我读过的内容来看,JWT似乎是一个不断增长的标准。它基本上保存了来电者的数据,因此每次他使用您的secret向您发出encrypt(base64(header) + "." + base64(payload))的API请求时,您都会将其与标记本身的最后一部分中提供的签名进行比较。它避免了必须执行数据库事务。

问题是,如果我使用JWT 1)我有没有可能手动吊销特定的标记,而且大部分都2)如果我改变一个用户的权限,先前授予JWT仍会有旧数据与他的旧权限可以授予/限制他持续访问某些数据,只要他没有获得具有新权限的新令牌,这实际上是有问题的,我很惊讶我没有看到任何人提到过这个问题呢。此外,JWT声称允许服务器验证访问而不访问数据库,但我无法想象任何不涉及数据库的API请求,只是为了返回用户请求的数据。所以这个论点对我来说没有任何意义。

对我而言,我现在最好的选择是选项2。网站将有限制和小流量,所以在数据库中存储令牌似乎是一个小而值得的权衡,并允许我用这些令牌做任何事情,包括管理它们的生命周期和权限。它还可以避免像使用选项1那样暴露用户的凭据,以防他们对其他在线服务使用相同的凭据。

我只想知道我对JWT的担忧是否正确,或者我误解了它的功能?另外,即使我已经阅读了很多关于这些不同的选项的内容,也可以随意链接任何可能让我喜欢的东西,并帮助我做出更好的选择。谢谢。

回答

1

你是对的,失效令牌在到期之前是一个常见的JWT问题。有几个理由需要考虑:帐户被删除/阻止/暂停,密码被更改,权限被更改,用户通过管理员注销。

智威汤逊,您还可以设置令牌黑名单,以存储注销之间&到期时间的标记,标记过期,检查它的每一个要求。当用户更改其密码/权限被签署令牌的哈希可以只包括ID(JWT的jti要求),或者使用上次登录的日期和iat要求(在发行)

其他技术无效令牌那些领域。如果字段值更改,则以前的任何令牌都将自动无法验证。

https://stackoverflow.com/a/37520125/6371459

最后,要注意的是,令牌与服务器的私有密钥(未加密)

sign(base64(header) + "." + base64(payload)) 
+0

与用户配置文件字段的哈希签名签署听起来像一个好主意和解决问题** 2)**。感谢您的解释。 – Flawyte

+0

关于*令牌黑名单*,我认为如果你打算在dabatase上存储任何东西,然后存储生成的令牌,因为它可以让你更好地控制它们(并且如果你没有把它保存在某个地方,你就不能将以前生成的令牌黑名单无论如何在世代时间)。 – Flawyte

+1

如果您不希望过多的令牌被吊销,您也可以使用内存中的黑名单。您只需在更新用户和'currentTime - maxExpiryTime lastModified'(不发送更多未过期的令牌)时,该条目可以被丢弃。在这种情况下,你不需要存储整个令牌。只是'sub','iat'或者'jti' – pedrofb