随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用户信息,随着之后jwt的出现,校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录更为简单。
Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。
Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWTs可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。
登录认证方案,将认证信息,返回给客户端,存储到客户端。下次访问其他页面,需要从客户端传递认证信息回服务端。
data就是用户信息数组,除了代码中base64的加密方式,当然你也可以设置更复杂的加密方式来的到ret得值
public function setToken($data) {
$expire = $ext['expires'] = time()+3600*24;//24小时过期时间;
$ext['ip'] = (new \S\Util\Ip())->getClientIp();
$ret = array_merge($data, $ext);
$ret = base64_encode(json_encode($ret));
$sign = hash_hmac('md5', $ret, '12D&(HS^H!lfV%Scj9fjEGhOyIP');
return $ret . '.' . $sign;
}
public function getToken($auth) {
$data = explode('.', $auth);
$sign = hash_hmac('md5', $data[0], '12D&(HS^H!lfV%Scj9fjEGhOyIP');
if ($sign !== $data[1]) {
return false;
}
return json_decode(base64_decode($data[0]), true);
}