您的位置:

使用ThinkPHP JWT进行接口认证

在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认证的优点。希望对大家有所帮助。