1、token发放
token生成之后需要发放给客户端,客户端后续的每一次app接口请求都需要先验证token,验证通过则请求继续,否则请求终止。那么,token如何发放到客户端呢?
其实token发放给客户端很简单,就像平台的登录验证,把需要验证的信息传递给服务器,服务器接收客户端传来的登录验证信息,验证通过,服务端就生成一个token并返回给客户端。
下面通过实例来演示token的发放过程:
(继续接着token生成的案例)
新建一个user控制器,用户的token获取及后续操作都由此控制器控制
在UserController控制器中新建一个login方法,用于验证登录信息并发放token,并将此方法绑定到路由中
UserController.php代码如下:
<?php namespace App\Http\Controllers; use App\Http\Response\ResponseJson; use App\User; use Illuminate\Routing\Controller as BaseController; use Illuminate\Http\Request; use App\Common\Auth\JwtAuth; //JWT token生成类 class UserController extends BaseController { use ResponseJson; /** * 登录获取Token * @param Request $request * @return false|string */ public function login(Request $request) { //接收用户名和密码 $username = $request->input('username'); $password = $request->input('password'); //获取用户uid,在获取中验证用户的有效性 $uid = User::getUid($username, $password); //uid 获取成功则生成Token返回给客户端 if($uid){ $JwtAuth = JwtAuth::getInstance(); $token = $JwtAuth->setUid($uid)->encode()->getToken(); return $this->jsonSuccessData([ 'token'=>$token ]); } } }
UserController路径
login方法绑定路由
其中 getUid 静态方法是验证用户输入的用户名和密码,只有在用户名和密码都正确的情况下才会返回对应用户的Uid,具体的实现代码这里就不展示了。
token发放实例:
2、token验证
这里我们通过中间件来验证token的有效性。
中间件:在请求和响应中间,进行请求数据的拦截处理,数据校验,并且进行逻辑处理后判断是否允许进入下一步。
在laravel中自定义中间件:
app/Http/Middleware是中间件存放的位置,现在在这个目录下新建一个 JwtMiddleware 中间件类,中间件的代码如下:
<?php namespace App\Http\Middleware; use App\Common\Auth\JwtAuth; use App\Http\Response\ResponseJson; use Closure; use Illuminate\Http\Request; use Fideloper\Proxy\TrustProxies as Middleware; use App\Common\Err\ApiErrDesc; class JwtMiddleware extends Middleware { use ResponseJson; /** * @param Request $request * @param Closure $next * @return false|mixed|string */ public function handle(Request $request, Closure $next) { $token = $request->input('token'); if($token) { $jwtAuth = JwtAuth::getInstance(); $jwtAuth = $jwtAuth->setToken($token); if ($jwtAuth->validate() && $jwtAuth->verify()){ return $next($request); }else{ return redirect()->action('UserController@tips',$this->jsonData(ApiErrDesc::ERR_TOKEN[0],ApiErrDesc::ERR_TOKEN[1], [], false)); } }else{ return redirect()->action('UserController@tips',$this->jsonData(ApiErrDesc::ERR_PARAMS[0],ApiErrDesc::ERR_PARAMS[1], [], false)); } } }
在app/Http/Kernel 类中注册中间件,在注册中间件时记得把中间件的命名空间引入进来
自定义中间件在项目中的位置
自定义中间件注册
然后在路由中绑定中间件:
自定义中间件绑定路由
所有group中绑定的方法在请求时都要先经过 JwtMiddleware 自定义中间件验证,验证不通过访问被终止。验证通过访问才能继续。
在laravel5.6发自定义中间件中似乎return的值必须为object,否则就会报错,所以这里自定义中间件验证不通过时直接让它跳转到提示页面,由提示页面展示错误信息。
在 UserController 写一个 info 方法来获取用户名,把info绑定到中间路由中,如上图自定义中间件绑定路由。
分别传入一个刚发放的token,及一个过期的token,以及不传token看会有什么结果。
验证结果:
验证通过:
token过期:
参数错误: