REST上的身份验证令牌
我有一个REST Jersey web服务。
我的问题是关于这个问题的答案,请检查;
PHP中基于令牌的身份验证
在那个答案中提到了那个;
然后它发送一个这个令牌的散列和请求的某些特征来验证请求,例如sha1(令牌+时间戳+请求URL +请求正文)。你的服务器可以验证这一点,而不需要客户端以纯文本发送令牌在每个请求上“。
任何人都可以解释服务器如何验证“客户端不需要在每个请求上以纯文本发送令牌”? 客户应该每次向服务器发送令牌?
另一个问题是,一旦服务器接收到这个令牌的散列(包括时间戳和userid ..等等),服务器如何从这个令牌识别用户,而没有存储令牌的查找表或DB?
对于第一个问题:客户端可以发送令牌的散列版本,服务器将散列值与从客户端收到的值进行比较。
对于第二个问题:您可以在内存或磁盘或任何您认为合适的位置保留令牌和用户之间的映射。
这是一种简单的例子,它使用只存在于服务器端的秘密密钥来加密/解密授权令牌的一部分。 AUTHORIZATION_TOKEN可以发送到客户端,并在任何后续请求中发送。
1)登录时,用户发送用户名,密码,sessionid,时间戳
2)成功的验证服务器产生TOKEN = encrypt(secretkey,userid + sessionid + time_stamp)。
3)服务器向客户端发送AUTHORIZED_TOKEN = TOKEN + userid + sessionid + timestamp
4)客户端在整个会话期间向每个请求发送该令牌
5)服务器解密AUTHORIZED_TOKEN的TOKEN部分,然后解压并比较来自TOKEN的解密的userid,sessionid,timestamp并将其与AUTHORIZED_TOKEN中的纯文本对应部分进行比较。
6)如果有任何不平等,服务器将重定向到登录页面。
7)没有重要的信息以纯文本形式发送。
8)Secretkey只存在于服务器端
9)由于令牌包含用户标识,因此没有用户映射到磁盘或内存