Laravel 6.0 安全文档:使用基于 Laravel Passport 的 API 身份验证
默认情况下,Laravel 通过为应用程序中的每个用户分配随机令牌来提供非常简单的 API 身份验证解决方案。配置文件 注意:虽然Laravel提供了上面简单的基于token的API认证,但我们强烈建议您在生产环境中使用基于Laravel Passport的API认证。 在使用 迁移文件之后创建完成后,运行 Artisan 命令 注意:如果您选择使用其他字段名称,请务必更新配置文件 生成哈希命令 未制作API,如果注册时不想使用API。相反,您必须在应用程序中实现自己的 API 令牌管理页面,该页面应允许用户初始化和更新自己的 API 令牌。当用户发起初始化或更新token的请求时,后端必须在数据库中存储该token的哈希值的备份,并将token的原始值返回给视图/前端客户端一次性查看。 例如,为给定用户初始化/更新令牌并以 JSON 响应形式返回令牌的原始值的控制器方法如下所示: 注意:由于上例中的 API,令牌拥有足够的熵,创建“彩虹表”来暴力破解该哈希令牌的原始值基本上是无用的,因此不需要使用像 Laravel 有一个内置的身份验证防护,可以自动验证输入请求中的 API 令牌。您只需在需要验证访问令牌的路由上使用 有多种方法可以将 API 令牌发送到应用程序。下面我们将一一介绍它们,并通过Guzzle HTTP库演示它们的使用。您可以根据需要选择这些方法中的任何一种。 查询字符串 应用程序的API消费者可以通过 API还可以向消费者提供架构数据。通过请求架构参数中的 Bearer Token 最后,应用程序的API消费者还可以使用添加config/
中,默认定义了一个api
guard,对应的驱动为。该驱动程序负责检查进入应用程序的请求的 API 令牌,并验证它是否与分配给用户的令牌值相同(分配给用户的令牌通常存储在数据库中)。
配置
数据库准备
token
驱动程序之前,您必须创建迁移以添加❙api_api users 数据表:Schema::table('users', function ($table) {
$table->string('api_token', 80)->after('password')
->unique()
->nullable()
->default(null);
});
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,
],
<?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];
}
}
bcrypt
这样的哈希方法。 路由保护
auth:api
中间件即可。可以: use Illuminate\Http\Request;
Route::middleware('auth:api')->get('/user', function(Request $request) {
return $request->user();
});
在请求中发送令牌
api_token
查询字符串指定其令牌值:$response = $client->request('GET', '/api/user?api_token='.$token);
api_token
字段引入:$response = $client->request('POST', '/api/user', [
'headers' => [
'Accept' => 'application/json',
],
'form_params' => [
'api_token' => $token,
],
]);
授权 提供他们的 API 作为令牌 令牌值:
$response = $client->request('POST', '/api/user', [
'headers' => [
'Authorization' => 'Bearer '.$token,
'Accept' => 'application/json',
],
]);
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。