欢迎光临
我们一直在努力

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

使用 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, //新增注册的中间件
];

  • 4、在路由中指定使用 jwt.api.auth
['middleware' => 'jwt.api.auth']

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

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

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

赞(0)
版权归原作者所有,如有侵权请告知。达维营-前端网 » 自定义中间件(Middleware)监听 Jwt-auth 身份认证(Laravel)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址