laravel Passport 使用要点记录

本文详细记录了 Laravel Passport 的使用过程,包括安装、运行迁移、创建访问令牌、配置令牌有效期,以及多表认证的注意事项,如客户端密码授权和个人授权的使用。同时,介绍了如何自定义登录用户名和处理多表认证问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装
composer require laravel/passport
运行迁移
php artisan migrate
创建访问令牌
  • [个人访问] 客户端和 [密码授权] 客户端
php artisan passport:install
  • 单独创建 密码授权 客户端
php artisan passport:client --password
  • 单独创建 个人访问 客户端
php artisan passport:client --client
模型中使用

在模型中加入 HasApiTokens Trait

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}
生成 Passport 生成访问令牌所需的秘钥(大白话:每生成一个令牌都要使用到它)

生成的秘钥一般情况不应放在版本控制中,默认生成的文件存放在 storage 目录下

php artisan passport:keys
令牌的有限期配置

在 AuthServiceProvider 中配置

public function boot()
{
    $this->registerPolicies();

    Passport::routes();
    // 配置 令牌 失效时间
    Passport::tokensExpireIn(now()->addDays(15));
    // 配置 刷新令牌 失效时间
    Passport::refreshTokensExpireIn(now()->addDays(30));
    // 配置 个人访问令牌 失效时间
    Passport::personalAccessTokensExpireIn(now()->addMonths(6));
}
密码授权方式获取访问令牌
http = new GuzzleHttp\Client;

$response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'username' => 'taylor@laravel.com',
        'password' => 'my-password',
        'scope' => '',
    ],
]);

return json_decode((string) $response->getBody(), true);
自定义登录用户名

在对应的 用户(如 User、Admin) 模型中进行设置

<?php

namespace App;

use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

    /**
     * 通过给定的username获取用户实例。
     *
     * @param  string  $username
     * @return \App\User
     */
    public function findForPassport($username)
    {
        return $this->where('username', $username)->first();
    }
}

demo:https://github.com/ruitaoZhang/laravel-api-demo

多表认证相关及注意要点

1、passport中有 客户端密码授权、个人授权。

如果是要用到第三方授权登录,可以使用 个人授权 Personal Token

  • 密码授权通过请求 /oauth/token 来获取 access_token
  • 个人授权可通过 $user->createToken ('name_string')->token 来获取
2、attempt 方法

Passport 的 guard 并未实现 attempt 方法,所有当使用 Auth::attempt($credentials) 会报错

3、多表用户认证,得到的 access_token 可以通过其他表认证?

解决

首先在 app/Kernel 中的 $routeMiddleware 加入

    'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
    'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,

AuthServiceProvider 中的 boot() 方法定义授权作用域(Scope)

    public function boot()
    {
        $this->registerPolicies();

        Passport::routes();
        // 定义作用域
        Passport::tokensCan([
            'admin-api' => 'admin api',
            'user-api' => 'user api',
        ]);
    }

在获取 token 时,指定对应的 作用域(Scope)

$user->createToken('Personal Access Token', ['user-api'])->token;

在认证路由中添加中间件

Route::group([
        'middleware' => ['auth:api', 'scope:user-api']
    ], function () {
        Route::post('userInfo', 'Api\AuthController@userInfo');
    });

相应文档地址:查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值