Code前端首页关于Code前端联系我们

Laravel 6.0 安全文档:使用基于 Laravel Passport 的 API 身份验证

terry 2年前 (2023-09-25) 阅读数 44 #后端开发

默认情况下,Laravel 通过为应用程序中的每个用户分配随机令牌来提供非常简单的 API 身份验证解决方案。配置文件config/中,默认定义了一个apiguard,对应的驱动为。该驱动程序负责检查进入应用程序的请求的 API 令牌,并验证它是否与分配给用户的令牌值相同(分配给用户的令牌通常存储在数据库中)。

注意:虽然Laravel提供了上面简单的基于token的API认证,但我们强烈建议您在生产环境中使用基于Laravel Passport的API认证。

配置

数据库准备

在使用token驱动程序之前,您必须创建迁移以添加❙api_api users 数据表:

Schema::table('users', function ($table) {
    $table->string('api_token', 80)->after('password')
                        ->unique()
                        ->nullable()
                        ->default(null);
});

迁移文件之后创建完成后,运行 Artisan 命令 php artisan migrate 使其生效。

注意:如果您选择使用其他字段名称,请务必更新配置文件config/中的配置元素storage_key

生成token

api_token 该字段添加到数据表users后,可以为每个注册用户分配一个随机的API Token。您必须在用户注册创建期间分配这些令牌 User。如果使用laravel/ui扩展包提供的认证脚手架代码,则可以在RegisterController控制器中完成此操作的 :

use Illuminate\Support\Str;
use Illuminate\Support\Facades\Hash;

/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return \App\User
 */
protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
        'api_token' => Str::random(60),
    ]);
}

在上面例如,哈希令牌是 以明文形式存储在数据库中的 API 令牌。如果想使用SHA-256等哈希算法计算token的哈希值然后保存,在配置文件config/中可以设置api元素hash 值为true 实现:
'api' => [
    'driver' => 'token',
    'provider' => 'users',
    'hash' => true,
],

生成哈希命令

未制作API,如果注册时不想使用API​​。相反,您必须在应用程序中实现自己的 API 令牌管理页面,该页面应允许用户初始化和更新自己的 API 令牌。当用户发起初始化或更新token的请求时,后端必须在数据库中存储该token的哈希值的备份,并将token的原始值返回给视图/前端客户端一次性查看。

例如,为给定用户初始化/更新令牌并以 JSON 响应形式返回令牌的原始值的控制器方法如下所示:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Str;
use Illuminate\Http\Request;

class ApiTokenController extends Controller
{
    /**
     * Update the authenticated user's API token.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function update(Request $request)
    {
        $token = Str::random(60);

        $request->user()->forceFill([
            'api_token' => hash('sha256', $token),
        ])->save();

        return ['token' => $token];
    }
}

注意:由于上例中的 API,令牌拥有足够的熵,创建“彩虹表”来暴力破解该哈希令牌的原始值基本上是无用的,因此不需要使用像bcrypt这样的哈希方法。

路由保护

Laravel 有一个内置的身份验证防护,可以自动验证输入请求中的 API 令牌。您只需在需要验证访问令牌的路由上使用 auth:api 中间件即可。可以:

use Illuminate\Http\Request;

Route::middleware('auth:api')->get('/user', function(Request $request) {
    return $request->user();
});

在请求中发送令牌

有多种方法可以将 API 令牌发送到应用程序。下面我们将一一介绍它们,并通过Guzzle HTTP库演示它们的使用。您可以根据需要选择这些方法中的任何一种。

查询字符串

应用程序的API消费者可以通过api_token查询字符串指定其令牌值:

$response = $client->request('GET', '/api/user?api_token='.$token);

API还可以向消费者提供架构数据。通过请求架构参数中的api_token字段引入:

$response = $client->request('POST', '/api/user', [
    'headers' => [
        'Accept' => 'application/json',
    ],
    'form_params' => [
        'api_token' => $token,
    ],
]);

Bearer Token

最后,应用程序的API消费者还可以使用添加授权 提供他们的 API 作为令牌 令牌值:

$response = $client->request('POST', '/api/user', [
    'headers' => [
        'Authorization' => 'Bearer '.$token,
        'Accept' => 'application/json',
    ],
]);

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门