项目遇到前后端分离的状况下,需要token验证传递一系列信息是必不可少的;
大部分情况下会使用jwt所提供的token来完成需求;
jwt---token的流程分为:
- 用户使用用户名密码来请求服务器
- 服务器进行验证用户的信息
- 服务器通过验证发送给用户一个token
- 客户端存储token,并在每次请求时附送上这个token值
- 服务端验证token值,并返回数据
前端登录成功后端会返回一个token字符串,下次前端再进行请求接口时需要提供请求状态Authorization(后台的token字符串);
composer require firebase/php-jwt // 使用composer安装jwt
jwt加密:
function getJwtToken($userid, $mobile) {
$key = config('jwt.key');
$jwtData = [
'lat' => config('jwt.lat'),
'nbf' => config('jwt.nbf'),
'exp' => config('jwt.exp'),
'uid' => $userid,
'mobile' => $mobile, //可以加入自己想要获得的用户信息参数
];
$jwtToken = JWT::encode($jwtData, $key);
return $jwtToken;
}
解密:
function checkJwtToken($token) {
$key = config('jwt.key'); //上一个方法中的 $key 本应该配置在 config文件中的
$info = JWT::decode($token, $key, ["HS256"]); //解密jwt
// dump($info);
return $info;
}
验证token:
//校验jwt权限API
protected function verifyJwt($jwt) {
$key = config('jwt.key');
// JWT::$leeway = 3;
try {
$jwtAuth = json_encode(JWT::decode($jwt, $key, array('HS256')));
$authInfo = json_decode($jwtAuth, true);
$msg = [];
if (!empty($authInfo['uid'])) {
$msg = ['status' => 1001, 'msg' => 'Token验证通过'];
} else {
$msg = ['status' => 1002, 'msg' => 'Token验证不通过,用户不存在'];
}
return $msg;
} catch (\Firebase\JWT\SignatureInvalidException $e) {
return array('status' => 1002, 'msg' => 'Token无效');
} catch (\Firebase\JWT\ExpiredException $e) {
return array('status' => 1003, 'msg' => 'Token过期');
} catch (Exception $e) {
return $e;
}
}