最新消息:文章中包含代码时,请遵守代码高亮规范!

PHP中对JWT的使用【原创】

杂项 Alex 97浏览 0评论

使用token进行身份验证过程
1.客户端使用账号密码进行登录
2.服务端接受到请求后验证账号以及密码的正确性,若正确则服务端回传一个Token
3.客户端接收到Token后对其进行存储,每次访问时需携带token
4.服务端在接受到客户端请求时需验证token,验证成功则回传数据。

生成与验证token的方法有很多种,这里使用的是jwt( Json Web Token)。

composer.json中引入firebase/php-jwt,composer后就可以使用了。


class JWTTool extends Controller {

public function __construct(ContainerInterface $container = null)
{
header("Content-Type: text/html; charset=utf-8");
$this->setContainer($container);
}
private $key = 'yayuanzi';//密钥
private $iss = "http://example.org/send";//签发者
private $aud = "http://example.org/accept";//接受者

/**
* @param $data 加密的数据
* @param int $is_exp 是否加入有效时间
* @param int $time 有效时长
* @return string
*/
public function generateToken($data,$is_exp = 1,$time = 86400){
$token['iss'] = $this->iss;
$token['aud'] = $this->aud;
$token['iat'] = strtotime(date('Y-m-d H:i:s'));
$token['aud'] = strtotime(date('Y-m-d H:i:s'));
if($is_exp){
$token['exp'] = strtotime(date('Y-m-d H:i:s'))+$time;
}
$token['data'] = $data;
$jwt = JWT::encode($token, $this->key);
return $jwt;
}

/**
*
* @param $jwt
* @param $client 平台号
* @return array|\Symfony\Component\HttpFoundation\Response
*/
public function verificationToken($jwt,$client)
{
$key = $this->key; //key要和签发的时候一样
try {
JWT::$timestamp = strtotime(date('Y-m-d H:i:s'));//当前时间
$decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式,这里要和签发的时候对应

if(empty($decoded->data)){
throw new Exception('未登录');
}

if(empty($decoded->data->client)){
throw new Exception('非法操作,端口错误');
}

if($decoded->data->client != $client){
throw new Exception('非法操作,端口错误');
}

return Responses::arrays(
'登录成功',
0,
['user_id'=>$decoded->data->user_id]
);
} catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
return Responses::arrays('签名错误',1);
}catch(\Firebase\JWT\BeforeValidException $e) { //
return Responses::arrays($e->getMessage(),1);
}catch(\Firebase\JWT\ExpiredException $e) { // token过期
return Responses::arrays('登录凭证失效',-1);
}catch(Exception $e) { //其他错误
return Responses::arrays($e->getMessage());
}
}

public function verificationOther($jwt,$data)
{
$key = $this->key; //key要和签发的时候一样
try {
JWT::$timestamp = strtotime(date('Y-m-d H:i:s'));//当前时间
$decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式,这里要和签发的时候对应

$tag_data = (array)$decoded->data;
foreach ($data as $k=>$v){
if(!array_key_exists($k,$tag_data)){
throw new Exception('验证失败');
}
if($tag_data[$k] != $data[$k]){
throw new Exception('验证失败');
}
}
return Responses::arrays(
'验证成功',
0,
$data
);
} catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
return Responses::arrays('签名错误');
}catch(\Firebase\JWT\BeforeValidException $e) { //
return Responses::arrays($e->getMessage());
}catch(\Firebase\JWT\ExpiredException $e) { // token过期
return Responses::arrays('凭证失效',1);
}catch(Exception $e) { //其他错误
return Responses::arrays($e->getMessage());
}
}

}


public function testAction(){
$JWTTool = new JWTTool($this->container);

$token = $JWTTool->generateToken(['client'=>'user','user_id'=>1],0);
$res = $JWTTool->verificationOther($token,['client'=>'user','user_id'=>1]);
return new JsonResponse($res);
}

 

转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/24496.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者Alex的打赏,我们会更加努力!    如果您想成为作者,请点我

您必须 登录 才能发表评论!