1

我有一个 REST Jersey 网络服务。

我的问题是关于这个问题的答案,请检查;

php中基于令牌的身份验证

在那个答案中,它提到了这一点;

“然后它会发送此令牌的哈希值和请求的某些特征来验证请求,例如 sha1(令牌 + 时间戳 + 请求 URL + 请求正文)。您的服务器可以验证这一点,而客户端无需以纯文本形式发送令牌每个请求。”

谁能解释服务器如何验证“客户端不必在每个请求中以纯文本形式发送令牌”?客户端应该每次都向服务器发送令牌吗?

另一个问题是,一旦服务器收到此令牌的哈希值(包括时间戳和用户 ID..等),服务器将如何从该令牌中识别用户,而无需查看存储令牌的表或数据库?

4

2 回答 2

1

对于第一个问题:客户端可以发送令牌的散列版本,服务器将散列值与从客户端接收的值进行比较。

对于第二个问题:您可以在内存或磁盘或您认为合适的任何地方保留令牌和用户之间的映射。

于 2012-12-22T13:40:24.857 回答
0

这是使用仅存在于服务器端的密钥对授权令牌的一部分进行加密/解密的方法的过度简化示例。AUTHORIZATION_TOKEN 可以发送到客户端,该客户端将在任何后续请求中传输。

1) 要登录,用户发送用户 ID、密码、会话 ID、时间戳
2) 在成功验证服务器上产生 TOKEN = encrypt(secretkey, userid + sessionid + time_stamp)。
3) 服务器向客户端发送 AUTHORIZED_TOKEN = TOKEN + userid + sessionid + 时间戳
4) 客户端在整个会话期间随每个请求发送此令牌
5) 服务器解密 AUTHORIZED_TOKEN 的 TOKEN 部分,然后解包并比较解密后的用户 ID、会话 ID、来自 TOKEN 的时间戳并将其与 AUTHORIZED_TOKEN 中的纯文本副本进行比较。
6)如果有任何不相等,服务器重定向到登录页面。
7) 没有以纯文本形式发送的重要信息。
8) Secretkey 只存在于服务器端
9) 由于令牌包含用户 ID,因此无需用户映射到磁盘或内存

于 2015-12-04T02:15:51.740 回答