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

李鹏2 10,013 次浏览

使用 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”
}

 


2 thoughts on “ 自定义中间件(Middleware)监听 Jwt-auth 身份认证(Laravel) ”

  1. 站长:蜗牛

    如有不正确的地方,欢迎指正~

  2. Chaly

    如何自定义token为空的错误信息?http://www.xxx.com/api/user/info?token=
    错误信息:”message”: “The token could not be parsed from the request”,
    “status_code”: 500,

发表评论

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen