前端时间遇到SSO(单点登录)的问题,是Java 用 JWT 与PHP语言的网站进行数据的互动,在网上搜了很久,没有发现比较合适的资料,可能JWT的方式PHP用的少?研究了下JWT,也就是JSON的字符换进行了加密,JSON我想很多语言都可以用了吧,剩下的就是按照规则进行解密,和判断登录是否成功了。
思路如下:
JWT的字符串是有规则的,以“.”分割,总共是三段,第一段包含的是加密的方法,中间是传递的参数,最后一段是用来判断的密钥。
前两端字符串先用Base64进行解密即可获取相应的数据;最后一段是用来判断前面的数据是否被非法篡改,就是用来判断参数真伪的,一般是把前两段的字符串连起来加上私有的密钥进行按规则的加密(规则在JWT的第一段)在进行Base64加密,对比字符串是否一致。
下面是自己写的个类,里面两个方法,一个是判断,一个是加密成数组方便使用:
class jwt
{
function jwt($jwtkey)//把获取到的参数
{
$url_str = $jwt = [];
$url_str = explode(".",$jwtkey);//截取字符串
$jwt['alg'] = $url_str[0];//定义新数组
$jwt['content'] = $url_str[1];
$jwt['hash'] = $url_str[2];
$alg = base64_decode($jwt['alg']);//base64解密
$content = base64_decode($jwt['content']);
$arr_jwt['alg'] = json_decode($alg,true);//生成可用的关联数组
$arr_jwt['content'] = json_decode($content,true);
$arr_jwt['hash'] = $jwt['hash'];
return $arr_jwt;
}
function jwt_validate($jwtkey,$key)//判断传值的安全
{
$arr_s = explode(".",$jwtkey);
$onetwo = $arr_s[0].'.'.$arr_s[1];
$three = $arr_s[2];
$hash = hash_hmac('SHA256',$onetwo,$key,true);
$hash = base64_encode($hash);
$hash = str_replace('/','_',$hash);
$hash = str_replace('+','-',$hash);
$hash = substr($hash,0,strlen($hash)-1);
if($hash == $three)
{
return true;
}
else
{
return false;
}
}
}