首页 > 解决方案 > 带有 Bearer 令牌的 Laravel API - 中间件 auth:api

问题描述

我正在尝试使用 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路由中使用此令牌才能进行身份验证。

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

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

标签: phplaravel

解决方案


迪克莱默

如果您需要自定义代码来处理身份验证,您应该创建自己的中间件和身份验证保护并使用它而不是 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 中间件组(在本例中为ThrottleRequestsandSubstituteBinding中间件)和 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

推荐阅读