我有一个REST Jersey网络服务。
我的问题是关于这个问题的答案,请检查;
token based authentication in php
在答案中,它提到了;
“然后它发送此令牌的散列和请求的某些特征来验证请求,例如sha1(令牌+时间戳+请求URL +请求正文)。您的服务器可以验证这一点,而无需客户端在每个请求上以纯文本形式发送令牌。“
任何人都可以解释服务器如何验证“没有客户端必须在每个请求上以纯文本形式发送令牌”?客户端应该每次都向服务器发送令牌吗?
另一个问题是,一旦服务器收到此令牌的散列(包括时间戳和userid..etc),服务器将如何从此令牌中识别用户而不具有存储令牌的外观表或DB?
答案 0 :(得分:1)
对于第一个问题:客户端可以发送令牌的散列版本,服务器将散列值与从客户端收到的值进行比较。
对于第二个问题:您可以在内存或磁盘上或您认为合适的任何位置保留令牌和用户之间的映射。
答案 1 :(得分:0)
这是一种方法的简化示例,该方法使用仅存在于服务器端的密钥来使用授权令牌的一部分的加密/解密。 AUTHORIZATION_TOKEN可以发送到客户端,该客户端将在任何后续请求中传输。
1)要登录,用户需要发送userid,password,sessionid,timestamp
2)成功验证服务器生成TOKEN = encrypt(secretkey,userid + sessionid + time_stamp)。
3)服务器向客户端发送AUTHORIZED_TOKEN = TOKEN + userid + sessionid + timestamp
4)客户端在整个会话期间向每个请求发送此令牌
5)服务器解密AUTHORIZED_TOKEN的TOKEN部分,然后解压缩并比较TOKEN中解密的用户ID,sessionid,时间戳,并将其与AUTHORIZED_TOKEN中的纯文本对应物进行比较。
6)如果存在任何不平等,服务器将重定向到登录页面
7)没有以明文形式发送重要信息
8)密钥仅存在于服务器端
9)没有用户映射到必要的磁盘或内存,因为令牌包含用户ID