IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    自定义中间件(Middleware)监听 Jwt-auth 身份认证(Laravel)

    李鹏发表于 2015-12-29 09:16:00
    love 0

    使用 Laravel 做 Api 接口,需要用到 Dingo Api / Jwt-auth。

     

    在定义 Api 返回内容时,特别是错误返回码时,特别注意一定要制定好统一的返回值格式。尤其是移动端APP。

     

    我们在使用Jwt-auth 时,按其 Github wiki 的说明:

    在 /app/Http/Kernel.php 中 $routeMiddleware 添加

    'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
    'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class,

    需要在路由组添加 :

    ['middleware' => ['jwt.auth','jwt.refresh']
    
    默认返回的错误内容为:
    {
       "error" : "token_not_provided"
    }

    其实,这是Jwt-auth 的默认中间件(Middleware)在处理身份认证。按其文档说明:我们可以在 /app/Exceptions/Handler.php 中可以进行异常判断。但有可能并没有效果。这种情况下,我们可以自己去添加一个中间件处理身份认证。

    • 1、添加一个 Middleware

    可以使用命令行添加:php artisan make:middleware GetUserFromToken

    此命令将会 在 app/Http/Middleware 目录内置立一个名称为 GetUserFromToken 的类。
    
    
    • 2、在 GetUserFromToken 中编辑代码
    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    use JWTAuth;
    use Tymon\JWTAuth\Exceptions\JWTException;
    use Tymon\JWTAuth\Exceptions\TokenExpiredException;
    use Tymon\JWTAuth\Exceptions\TokenInvalidException;
    
    class GetUserFromToken
    {
        /**
         * 身份验证.
         *
         * Author : LeePeng
         * email: lp@kuhui.com.cn
         * Date: 15/12/29
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
    public function handle($request, Closure $next)
    {
        try {
    
            if (! $user = JWTAuth::parseToken()->authenticate()) {
                return response()->json([
                    'errcode' => 400004,
                    'errmsg' => 'user not found'
                ], 404);
            }
    
        } catch (TokenExpiredException $e) {
    
            return response()->json([
                'errcode' => 400001,
                'errmsg' => 'token expired'
            ], $e->getStatusCode());
    
        } catch (TokenInvalidException $e) {
    
            return response()->json([
                'errcode' => 400003,
                'errmsg' => 'token invalid'
            ], $e->getStatusCode());
    
        } catch (JWTException $e) {
    
            return response()->json([
                'errcode' => 400002,
                'errmsg' => 'token absent'
            ], $e->getStatusCode());
    
        }
        return $next($request);
    }
    }
    • 3、在 /app/Http/Kernel.php 中 $routeMiddleware 新增 内容
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
        'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class,
        'jwt.api.auth' => \App\Http\Middleware\GetUserFromToken::class, //新增注册的中间件
    ];
    
    
    • 3、在路由中指定使用 jwt.api.auth
    ['middleware' => 'jwt.api.auth']

    完成上面的操作,我们新增处理接口身份认证中间件就完成了。

    可以进行测试,你会发现现在的错误内容为:

    {
    “errcode”: 400002,
    “errmsg”: “token absent”
    }

     



沪ICP备19023445号-2号
友情链接