[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',
],
]);
```
- 入门指南
- 安装
- 部署
- 基础功能
- 路由
- 中间件
- CSRF 保护
- 控制器
- 请求
- 响应
- 视图
- URL
- Session
- 表单验证
- 错误
- 日志
- 前端开发
- Blade 模板
- 本地化
- 脚手架
- 编译资源 Mix
- 安全相关
- 用户认证
- API 认证
- 综合话题
- 命令行
- 广播
- 缓存
- 集合
- 事件
- 文件存储
- 辅助函数
- 邮件发送
- 消息通知
- 扩展包开发
- 队列
- 任务调度
- 数据库
- 快速入门
- 查询构造器
- 分页
- 数据库迁移
- 数据填充
- Redis
- Eloquent ORM
- 快速入门
- 速查表
- Artisan
- Auth
- Blade
- Cache
- Collection
- Composer
- Config
- Container
- Cookie
- DB
- Environment
- Event
- File
- Helper
- Input
- Lang
- Log
- Model
- Pagination
- Queue
- Redirect
- Request
- Response
- Route
- SSH
- Schema
- Security
- Session
- Storage
- String
- URL
- UnitTest
- Validation
- View