在Web开发中,接口认证是很重要的一个环节。而JWT(Json Web Token)是目前比较常用的一种Token认证方式,因为它是无状态,所以在分布式的环境下很适合。ThinkPHP JWT是一个基于ThinkPHP5的JWT扩展,它可以帮助我们快速实现JWT的功能。
一、安装和配置
首先,我们需要安装ThinkPHP JWT扩展,可以通过Composer进行安装:
composer require smartisan/think-jwt
然后,在config目录下创建jwt.php文件,用于配置:
return [
'key' => 'thinkphpjwt', // 用于签名的Key
'iss' => 'thinkphp', // 签发者
'aud' => 'client', // 面向的用户
'exp' => 7200, // 过期时间,单位秒
'nbf' => 300, // 在此时间之前不可用,单位秒
'sub' => '', // 主题
];
其中,'key'是用于签名的Key,建议设置为随机字符串,'iss'是签发者,'aud'是面向的用户,'exp'是过期时间,'nbf'是在此时间之前不可用,'sub'是主题。
接下来,在config目录下的middleware.php文件中添加中间件:
return [
'jwtAuth' => \smartisan\jwt\middleware\JWTAuth::class,
];
这样,我们就将JWT认证的中间件加入到了中间件列表中,可以在需要认证的接口中使用该中间件进行认证。
二、生成和解析Token
采用JWT认证的过程中,需要生成Token,然后发送给客户端,客户端在请求接口时需要带上该Token进行认证。而服务端在接收到请求之后需要解析Token,然后进行认证。下面我们分别来看一下如何生成Token和如何解析Token。
1、生成Token
首先,我们需要在需要认证的控制器中生成Token:
use smartisan\jwt\JWT;
class UserController extends Controller
{
public function login()
{
// 验证用户名和密码
...
// 生成Token
$key = config('jwt.key'); // 获取key
$jwt = JWT::getInstance();
$payload = [
'uid' => $user['uid'],
'username' => $user['username'],
'exp' => time() + config('jwt.exp'),
];
$token = $jwt->getToken($payload, $key);
// 返回Token
return json([
'code' => 200,
'msg' => '登录成功',
'token' => $token,
]);
}
}
在上面的代码中,我们将uid和username放入了payload中,并设置Token的过期时间。然后通过JWT::getInstance()获取JWT实例,调用getToken()方法生成Token,最后将Token返回给客户端。
2、解析Token
在接收到客户端请求时,我们需要先解析Token,然后进行认证:
use smartisan\jwt\JWT;
class UserController extends Controller
{
public function getInfo()
{
// 解析Token
$token = request()->header('Authorization');
$key = config('jwt.key'); // 获取key
$jwt = JWT::getInstance();
try {
$payload = $jwt->verifyToken($token, $key);
} catch (\Exception $e) {
return json([
'code' => 401,
'msg' => '未登录或登录已过期',
]);
}
// 认证通过,返回用户信息
...
}
}
在上面的代码中,我们通过request()->header('Authorization')获取请求头中的Token,然后通过JWT::getInstance()获取JWT实例,调用verifyToken()方法解析Token,如果Token解析失败,则返回401状态码,认证失败;否则,认证通过,返回用户信息。
三、在路由中使用中间件
在ThinkPHP中,我们可以在路由中使用中间件,方便进行接口认证。在路由文件中,可以使用middleware()方法来添加中间件:
use think\Route;
Route::get('user/info', 'user/getInfo')->middleware('jwtAuth');
在上面的代码中,我们将'user/getInfo'这个接口使用jwtAuth中间件进行认证。
四、使用JWT认证的优点
JWT认证有以下几个优点:
1、无状态
由于采用了JWT认证方式,因此我们不需要再维护Session或者Token,也不需要在服务端存储Token。这样,就可以避免诸如Session劫持等安全问题。
2、轻量级
JWT认证的Token可以很轻松地在不同的服务之间传递,因为它是一种基于Base64编码的Token。这样,对于服务端的负载也比较小。
3、可扩展性强
JWT认证是一种开放标准,因此可以很方便地扩展使用,也可以嵌入到其它的认证方式中。
4、易于实现
使用ThinkPHP JWT可以很方便地实现JWT认证,也可以很好地与ThinkPHP框架结合使用。
五、总结
本文主要对使用ThinkPHP JWT进行接口认证进行了详细的介绍,包括安装和配置、生成和解析Token、在路由中使用中间件和JWT认证的优点。希望对大家有所帮助。