使用 Laravel 的 Authenticate 认证是非常爽的,不过当我想要通过 API 使用 auth:api 中间件来认证用户登陆状态时,发现一直过不了认证,配置 Cookie 也是无效… 一直跳登陆页面。
刚开始我以为问题出在 app/Http/Middleware/Authenticate.php 中的 redirectTo 方法未处理 API 的返回。
菜鸡的我整了好久,才发现方向错了呀。通过一阵子的资料查找,我发现 Laravel 默认原来是没有处理 token 的,需要我们自己实现一下。
首先配置一下 config/auth.php 将 api 下的 driver 字段配置为 token。Laravel 8 好像是已经自动配置好了,检查一下没有问题的话我们就开始实现相关业务代码。
我们先是需要在 users 表中加上一个 api_token 字段,项目下执行命令 php artisan make:migration update_users_table_for_api_token --table=users
生成迁移文件。
修改生成的迁移文件代码实现添加 string 类型的 api_token 字段。
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
// 字段名固定,长度建议64
$table->string('api_token', 64)->unique();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('api_token');
});
}
然后在项目下执行命令 php artisan migrate
执行迁移,数据表 users
就会添加 api_token
字段。
在表里添加好 api_token 字段后,把 api_token 字段添加到 User
模型的 $fillable
和 $hidden
属性中。
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password','api_token',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token','api_token'
];
然后在你创建用户的函数中添加生成 token 的代码,下面是我的创建用户实现函数,主要是调用了 Str::random 函数生成 64 个随机字符
/**
* @description: 创建一个用户
* @param {String} $name
* @param {String} $avatar_url
* @return app\User
*/
public static function create(String $name, String $avatar_url)
{
$user = new User();
$user->name = Str::random(6);
$user->password = Str::random(30);
$user->name = $name;
$user->avatar_url = $avatar_url;
$user->api_token = Str::random(64);
$user->save();
return $user;
}
现在就基本已经实现了 Laravel Authenticate 配置 API Token 支持,创建一个用户之后在数据库中应该可以看的到该用户 api_token
最后在 routes/api.php
里面配置路由,使用 token 方式时一定要使用中间件 auth:api
。
Laravel 默认已经帮我们配置了一个 API 路由,我们可以直接用这个路由来测试。
use Illuminate\Http\Request;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
接下来就是使用这个 api_token ,有两种方式可以直接使用该 api_token 来请求就可以直接过认证 Authenticate ,我这边就直接使用 Postman 来测试一下请求了
1,在请求中添加 header 头部发送 Authorization
获取用户,value 的话需要用 Bearer 加上 api_token,参考如下图
2,在请求中发送 api_token
字段数据获取用户,如下图也是可以用的。
第一次开始 “输出“ 后端业务上实现的博客,写的不好还请多多见谅。如有错误还请小伙伴指出,一起成长鸭,冲!