我现在需要写一个用户登录的端口,前端发送登录信息用户名:xiaoming,密码:123456到端口www.abc.com/php/login.php,这个PHP要验证用户名和密码,然后生成一个token和用户信息返回给前端,然后前端再次请求的时候会带上这个token,php要怎么验证解析这个token并返回相应的用户信息,这个php文件要怎么写呢?
<?php
require_once '../vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
?>
第一 账号密码登录 获取token
JWT需要composer安装下,然后调用
$jwt_config = [
'iss' => config('jwt.iss'), //签发者 可选
'aud' => config('jwt.iss'), //接收该JWT的一方,可选
'iat' => time(), //签发时间
'nbf' => time() , //(Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用
'exp' => time()+7200, //过期时间,这里设置2个小时
'data' => [ //自定义信息,不要定义敏感信息
'user_id' => $user_data['id']
]
];
$token=JWT::encode($jwt_config,config('jwt.key'),'HS256');
第二 解密token
//检测token
public function check_token($token){
try {
JWT::$leeway = 60;//当前时间减去60,把时间留点余地
$decoded = JWT::decode($token, config('jwt.key'), ['HS256']); //HS256方式,这里要和签发的时候对应
$arr = (array)$decoded;
$result=['code'=>200,'msg'=>'OK','user_id'=>$arr['data']->user_id];
} catch(SignatureInvalidException $e) { //签名不正确
$result=['code'=>400,'msg'=>$e->getMessage()];
}catch(BeforeValidException $e) { // 签名在某个时间点之后才能用
$result=['code'=>400,'msg'=>$e->getMessage()];
}catch(ExpiredException $e) { // token过期
$result=['code'=>400,'msg'=>$e->getMessage()];
}catch(\Exception $e) { //其他错误
$result=['code'=>400,'msg'=>$e->getMessage()];
}
return $result;
}
这样就能得到用户id
class Token
{
public static function createToken($uid = null)
{
$signer = new Sha256();//加密规则
$time = time();//当前时间
$token = (new Builder())
->issuedBy('teacher')//签发人
->canOnlyBeUsedBy('student')//接收人
->identifiedBy('MarsLei', true) //标题id
->issuedAt($time)//发出令牌的时间
->canOnlyBeUsedAfter($time) //生效时间(即时生效)
->expiresAt($time + 3600) //过期时间
->with('uid', $uid) //用户id
->sign($signer, 'my') //签名
->getToken(); //得到token
return (string)$token;
}
public static function verifyToken($token = null)
{
//检测是否接收到了token
if (empty($token)) {
return 0;
}
//转化为可以验证的token
$token = (new Parser())->parse((string)$token);
//验证基本设置
$data = new ValidationData();
$data->setIssuer('teacher');
$data->setAudience('student');
$data->setId('MarsLei');
if (!$token->validate($data)) {
return 0;
}
//验证签名
$signer = new Sha256();
if (!$token->verify($signer, 'my')) {
return 0;
}
//验证通过,返回用户id
return $token->getClaim('uid');
}
}
验证用户名和密码正确以后得到用户ID,然后 调用
//生成Token
$token=Token::createToken($id);
验证Token的话,就用以下验证
//验证Token
$res=Token::verifyToken($token);
if ($res==0){
$this->error('Token令牌失效','test/Login/login');
}