Laravel5.5 api token 用法

从 Laravel 5.2 开始, Laravel 的将路由的配置进行了分拆, 在 routes 目录下有 web.php 和 api.php 两个路由的配置。 api.php 中用来放你的api 开放接口, 用作一种无状态的认证机制。

基本上就是通过在 url 的 querystring 中带一个参数 api_token 然后到服务器端用户表中找到此用户。

在Laravel 文档中对这块基本上没有说明。下面来看下实现步骤:

配置步骤

1. 首先要在用户表中添加 api_token 字段

你可以修改Laravel自带的迁移文件

打开 database/migrations/2014_10_12_000000_create_users_table.php
添加 api_token 字段

1
2
3
4
5
6
7
8
9
10
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
//添加 api_token 字段
$table->string('api_token', 60)->unique();
$table->rememberToken();
$table->timestamps();
});

然后你可以重置并重新运行migration

1
2
php artisan migrate:reset
php artisan migrate

2.设置路由

在 routes/api.php 中设置我们的路由

1
2
3
4
5
6
Route::prefix('v1')->middleware('auth:api')->group(function() {
// 取单条数据
Route::get('notes/{id}',function($id){
return Note::select('title', 'content')->find($id);
});
});

使用 prefix 方法将 group 中的所有路由规则的url都加上 v1(版本号) 前缀,所以实际的请求地址是 :/api/v1/notes/{id}

middleware 使用 auth:api, :api代表使用的 Guard(看门)类, 在 config/auth.php 中可以看到 api Guard 的驱动设置的是 token, 这表示所有使用了 auth:api 中间路由规则,请求中都必须带 api_token 参数

打开 config/auth.php 配置稍微解释下

1
2
3
4
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],

这个配置表示 默认的 guard 是web,意思是如果直接使用 meddleware('auth') 其实是 meddleware('auth:web')

1
2
3
4
5
6
7
8
9
10
11
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],

'api' => [
'driver' => 'token',
'provider' => 'users',
],
],

指名了各个guard所使用的驱动,web的话是session,api的话就是 token。

3.用户注册时,需生成一个api_token

在 App\Http\Controllers\Auth\RegisterController.php文件的创建用户中添加 api_token 字段;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return User
*/
protected function create(array $data)
{
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'api_token' => str_random(60), // api_token认证
]);

$this->sendVerifyEmailTo($user);

return $user;
}

最后,不要忘记在 App\User.php用户模型表中的 $fillable 属性当中添加api_token字段:

1
2
3
protected $fillable = [
'name', 'email', 'password','api_token'
];

如何获取用户信息
Auth::guard('api')->user();

使用

有关token认证的原理,我们可以看该目录下的底层方法:
vendor\laravel\framework\src\Illuminate\Auth\TokenGuard.php

1.重写resource\assets\js\bootstrap.js认证方法:

1
2
3
4
5
6
7
8
9
10
11
/*
// API token 认证-【20170321
window.axios.defaults.headers.common = {
'X-CSRF-TOKEN': window.Laravel.csrfToken,
'X-Requested-With': 'XMLHttpRequest' # 这一句必须带上,是为了让laravel能够判断request的类型为ajax,即$request->ajax()返回true
};
*/
window.axios.defaults.headers.common = {
'X-CSRF-TOKEN': window.Laravel.csrfToken,
'Authorization': window.Laravel.apiToken
};

2. app.blade.php中增加api_token 判断

1
2
3
4
5
6
7
8
<!-- Scripts -->
<script>
window.Laravel = {!! json_encode([
'csrfToken' => csrf_token(),
]) !!};

Laravel.apiToken = "{{ Auth::check() ? 'Bearer '.Auth::user()->api_token : 'Bearer ' }}";
</script>

相关文章:
Laravel 的 API 认证系统 Passport
Laravel5.4 Vue 框架中 X-CSRF-TOKEN 的两种设置方法
【日常填坑】之ajax请求laravel的api接口