JWT(JSON Web Token)是一种基于JSON的开放标准(RFC 7519),它允许我们安全地将信息编码为一个字符串,在各个方之间传递该字符串,以便验证和信任该信息。它是一种跨域认证方式,可以很好地解决跨域请求的认证问题。本文将介绍如何使用ThinkPHP5来实现JWT Token认证。
使用composer安装JWT扩展包,在命令行中输入:
composer require firebase/php-jwt
在ThinkPHP5中,我们可以将JWT Token认证配置到指定的控制器中,或者配置到某个控制器的某个方法中,以实现更细粒度的控制。
编写一个接口,用于获取Token,在接口中,我们需要对用户的账号和密码进行校验,根据校验的结果,返回Token给客户端。
public function getToken(){ // 接收用户的账号和密码 $account = Request::param('account'); $password = Request::param('password'); // 校验用户的账号和密码 $user = Db::table('user')->where('account', $account)->find(); if($user){ if($user['password'] == md5($password)){ // 获取当前时间 $time = time(); // 设置Token的有效期 $expire = $time + 7200; // 设置Token $token = [ 'iss' => 'http://www.example.com', //签发者 'aud' => 'http://www.example.com', //jwt所面向的用户 'iat' => $time, //签发时间 'nbf' => $time, //在什么时间之后该jwt才可用 'exp' => $expire, //过期时间-10min 'data' => [ 'user_id' => $user['id'], 'username' => $user['username'] ] ]; // 对Token进行加密 $jwt = JWT::encode($token, 'secret'); // 返回Token return json(['token' => $jwt]); }else{ return json(['msg' => '账号或密码错误']); } }else{ return json(['msg' => '账号不存在']); } }
编写一个中间件,用于验证Token,在每次请求的时候,都会先去验证Token是否有效,如果Token有效,则继续执行后续的操作,如果Token无效,则返回错误信息。
public function handle($request, \Closure $next) { // 获取请求头中的token $token = Request::header('token'); // 对token进行解密 $decoded = JWT::decode($token, 'secret', array('HS256')); // 判断token是否过期 if($decoded->exp < time()){ return json(['msg' => 'token已过期']); } // 验证成功,继续执行 return $next($request); }
在需要使用Token认证的接口中,我们可以在控制器或者控制器的某个方法中,使用中间件来进行Token的验证,以实现认证功能。
public function index(){ return json(['msg' => '验证成功']); }
本文介绍了如何使用ThinkPHP5实现JWT Token认证,以实现跨域认证的功能。我们需要安装JWT扩展包,配置JWT Token认证,编写获取Token的接口,编写验证Token的中间件,在需要使用Token认证的接口中,使用中间件来进行Token的验证,以实现认证功能。
本文链接:http://task.lmcjl.com/news/7153.html