代码之家  ›  专栏  ›  技术社区  ›  Code Lover

这是制作Laravel令牌中间件的正确方法吗

  •  0
  • Code Lover  · 技术社区  · 7 年前

    我想让我的API对每个没有令牌访问的客户端都不可用。

    这意味着Android应用程序将发送 client android token token string 在标题中使用键 客户 代币

    现在在 middleware ,我正在用我的表字段检查它以通过授权。如果两者都匹配,则我将授权,如果不匹配,则将发送 403 回答

    我知道护照,但它不是我要找的。事实上 将其视为第一层安全,然后使用Passport作为 授权API的第二层安全性

    此代码是否正确?

    因为我不太熟悉 Laravel - Middleware 我只是想从专家那里得到一些反馈,看看我写的代码是否准确,是否符合标准。如果没有,我将感谢你的建议,并帮助它变得更好。

    中间件

    namespace App\Http\Middleware;
    
    use App\ApiToken;
    use Closure;
    use function response;
    
    class ApiAccess
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request $request
         * @param  \Closure                 $next
         *
         * @return mixed
         */
        public function handle( $request, Closure $next ) {
    
            if ( $this->checkToken( $request ) ) {
                return $next( $request );
            }
    
            return response()->json( [ 'error' => 'Unauthorized' ], 403 );
    
    
        }
    
        public function checkToken( $request ) {
    
            $client = $request->header( 'client' );
            $token  = $request->header( 'token' );
    
            $checkToken = ApiToken::where( 'client', $client )
                                  ->where( 'token', $token )->first();
    
            return $checkToken;
        }
    }
    

    API路由

    我从ApiToken表中获取结果只是为了检查。

    Route::get('/', function(Request $request) {
        return ApiToken::all();
    })->middleware('apiAccess');
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Muhammad Nauman    7 年前

    我无法在这里添加评论。这对我来说似乎是对的,但我认为不需要额外的一层。也许你的需求需要它。无论如何,您可以改进checkToken函数以返回布尔值。这是:

    public function checkToken( $request ) {
    
        $client = $request->header( 'client' );
        $token  = $request->header( 'token' );
    
        return ApiToken::where( 'client', $client )
                              ->where( 'token', $token )->exists();
    // Nicer, and it will return true and false based on the existence of the token and client.
    }
    

    还有一件事,当访问被禁止时,将返回状态代码403。401返回时出现未经授权的错误。