使用 Laravel 的 Authenticate 认证是非常爽的,不过当我想要通过 API 使用 auth:api 中间件来认证用户登陆状态时,发现一直过不了认证,配置 Cookie 也是无效… 一直跳登陆页面。

刚开始我以为问题出在 app/Http/Middleware/Authenticate.php 中的 redirectTo 方法未处理 API 的返回。

菜鸡的我整了好久,才发现方向错了呀。通过一阵子的资料查找,我发现 Laravel 默认原来是没有处理 token 的,需要我们自己实现一下。

首先配置一下 config/auth.php 将 api 下的 driver 字段配置为 token。Laravel 8 好像是已经自动配置好了,检查一下没有问题的话我们就开始实现相关业务代码。

Laravel Authenticate 配置 API Token 支持-天真的小窝

我们先是需要在 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

Laravel Authenticate 配置 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,参考如下图

Laravel Authenticate 配置 API Token 支持-天真的小窝

2,在请求中发送 api_token 字段数据获取用户,如下图也是可以用的。

Laravel Authenticate 配置 API Token 支持-天真的小窝

第一次开始 “输出“ 后端业务上实现的博客,写的不好还请多多见谅。如有错误还请小伙伴指出,一起成长鸭,冲!