ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # API 认证 ## 简介 Laravel 提供一个简单的基于令牌的身份验证,但建议使用 [Laravel Passport](https://learnku.com/docs/laravel/5.8/passport) 来实现提供 API 身份验证。 ## 配置 ``` // 创建迁移,在 users 表中添加列 api_token // php artisan make:migration add_api_token_to_users_table --table=users public function up() { Schema::table('users', function (Blueprint $table) { $table->string('api_token', 80)->after('password') ->unique() ->nullable() ->default(null); }); } public function down() { Schema::table('users', function (Blueprint $table) { $table->dropColumn('api_token'); }); } // 创建后执行 $ php artisan migrate ``` 令牌生成 ``` // 在注册控制器 RegisterController 的 create 方法中设置 // 此设置是以文本方式存储在数据库 use Illuminate\Support\Str; use Illuminate\Support\Facades\Hash; /** * 在有效注册之后创建一个新用户实例: * * @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_token 以 SHA-256 散列方式存储数据库 'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => true, ], ``` ### 生成哈希令牌 使用哈希令牌时, 你不应该在用户注册期间生成 API 令牌。 相反, 你需要在应用程序中实现自己的 API 令牌管理页面。 这个页面应该允许用户初始化和刷新其 API 令牌。 当用户发出初始化或者刷新令牌请求时,你应该在数据中存储令牌的哈希副本,并将令牌的纯文本副本返回到视图 / 前端客户端进行一次显示。 例如,为给定用户初始化 / 刷新令牌并将纯文本令牌作为 JSON 响应返回的控制器方法可能如下所示: ``` // 需要新增页面以处理哈希令牌的初始化与更新 <?php namespace App\Http\Controllers; use Illuminate\Support\Str; use Illuminate\Http\Request; class ApiTokenController extends Controller { /** * 更新已经验证过的用户的 API 令牌。 * * @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]; } } ``` ## 路由保护 ``` // 测试链接:http://test.com/api/user?api_token=令牌 use Illuminate\Http\Request; Route::middleware('auth:api')->get('/user', function(Request $request) { return $request->user(); }); /* * 设置请求头部 * Content-Type: application/x-www-form-urlencoded * X-Requested-With: XMLHttpRequest * Authorization: Bearer 令牌 * * 或者设置请求参数 * api_token: 令牌 */ Route::middleware('auth:api')->post('/update', function () { return ['data'=>'update']; }); ``` ## 请求中传递令牌 例子使用 Guzzle HTTP 库演示,可以根据应用程序的需要选择其他请求方式。 ``` // 链接参数 $response = $client->request('GET', '/api/user?api_token='.$token); // 表单参数 $response = $client->request('POST', '/api/user', [ 'headers' => [ 'Accept' => 'application/json', ], 'form_params' => [ 'api_token' => $token, ], ]); // Bearer令牌,请求头 $response = $client->request('POST', '/api/user', [ 'headers' => [ 'Authorization' => 'Bearer '.$token, 'Accept' => 'application/json', ], ]); ```