## **安装jwt扩展**
```bash
$ composer require firebase/php-jwt
```
## 引入命名空间
```php
use Firebase\JWT\BeforeValidException;
use Firebase\JWT\ExpiredException;
use Firebase\JWT\JWT;
use Firebase\JWT\SignatureInvalidException;
```
## 注册Token方法
```
/**
* 生成token
* @param $uid
* @return mixed
*
*/
function signToken($uid)
{
$key = 'todo.im'; // 盐 salt
$token = array(
"iss" => $key, // 签发者 可以为空
"aud" => '', // 面象的用户,可以为空
"iat" => time(), // 签发时间
"nbf" => time(), // 在什么时候jwt开始生效
"exp" => time() + 2000, // token 过期时间
"data" => [
'uid' => $uid,
]
);
$jwt = JWT::encode($token, $key, "HS256");
return $jwt;
}
```
## 验证token方法
```
/**
* 验证token
* @param $token
* @return int[]
*/
function checkToken($token)
{
$key = 'todo.im';
$status = array("code" => 2);
try {
JWT::$leeway = 60;//当前时间减去60,把时间留点余地
$decoded = JWT::decode($token, $key, array('HS256')); //HS256方式,这里要和签发的时候对应
$arr = (array)$decoded;
$res['code'] = 1;
$res['data'] = $arr['data'];
return $res;
} catch (SignatureInvalidException $e) { //签名不正确
$status['msg'] = "签名不正确";
return $status;
} catch (BeforeValidException $e) { // 签名在某个时间点之后才能用
$status['msg'] = "token失效";
return $status;
} catch (ExpiredException $e) { // token过期
$status['msg'] = "token失效";
return $status;
} catch (Exception $e) { //其他错误
$status['msg'] = "未知错误";
return $status;
}
}
```
## 使用
```php
$user['token'] = signToken($user['id']);
```
验证 token ,这里的token一般用 header 方式传送,接收后直接调用 直接调用 common.php 文件的 checkToken方法即可。验证成功返回加密的token信息。验证失败返回提示信息。
~~~php
$token = Request::instance()->header('token');$res = checkToken($token);
~~~