【问题标题】:Laravel API with Bearer token - Middleware auth:api带有 Bearer 令牌的 Laravel API - 中间件 auth:api
【发布时间】:2019-03-05 07:48:52
【问题描述】:

我正在尝试使用 Bearer Token 创建一个 API,但我无法弄清楚:

  1. route::middleware('auth:api') 有什么作用
  2. route::middleware('auth:api')的代码在哪里

所以,我的Routes\Api.php 文件中有以下代码:

Route::get('/login', function (Request $request) 
{
    if(Auth::guard()->attempt(['email' => $request->email, 'password' => $request->password]) == FALSE)
        return response()->json(['status' => FALSE]);

    $user = Users::select('id', 'name', 'api_token', 'created_at')->where('email', $request->email)->firstOrFail();

    return response()->json(['status' => TRUE, 'user' => $user]);
});

Route::middleware('auth:api')->get('/bookings', function (Request $request)
{
    return response()->json(['its working!']);
});

我能够成功连接到路由/login 并检索api_token。现在必须在/bookings 路由中使用此令牌才能进行身份验证。

我正在为Authorization: Bearer zzzzzzzzz 跳过middleware('auth:api')verify 我的CURL 标头,但它不起作用。

所以基本上我需要了解如何更改auth:api 背后的代码逻辑,或者我是否应该创建一个新的中间件并检查请求标头?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    Diclamer

    如果您需要自定义代码来处理身份验证,您应该创建自己的中间件和身份验证保护并使用它而不是 Laravel 提供的默认代码。

    您的问题

    route::middleware('auth:api') 是做什么的

    它声明路由应该实现中间件“auth”和中间件组“api”。

    route::middleware('auth:api')的代码在哪里

    Laravel 中的所有中间件都在app/Http/Kernel.php 中定义。

    在那里你可能会看到类似的东西

    protected $middlewareGroups = [
        ....,
        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];
    

    protected $routeMiddleware = [
        ...,
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ];
    

    这意味着使用中间件auth:api 的路由实现了api 中间件组(在本例中为ThrottleRequestsSubstituteBinding 中间件)和auth 中间件(Authenticate)。

    实际使用的身份验证保护取决于您的 auth.php 配置文件中的配置:

    'guards' => [
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],
    

    在上述情况下,使用了 TokenGuard (laravel/framework/src/Illuminate/Auth/TokenGuard.php)。

    所以要回答你的问题,可以在以下位置找到 auth 中间件的代码

    laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php
    

    【讨论】:

    • 除了您的回答之外,我应该声明 api_token 应该作为 URL 参数而不是作为标题发送。现在一切正常。
    猜你喜欢
    • 2021-08-21
    • 2014-10-05
    • 1970-01-01
    • 2018-05-19
    • 2019-06-29
    • 1970-01-01
    • 2021-01-21
    • 2020-02-09
    • 2019-02-18
    相关资源
    最近更新 更多