Passport 认证

  • 安装conposer拓展

    composer require laravel/passport

  • 生成passport配置文件

<?php
return [
    'scopes' => [
        'place-orders' => 'Place orders',
        'check-status' => 'Check order status',
        '*' => 'all scopes',
    ],
    'default' => [
        'client_id' => env('CLIENT_ID'),
        'client_secret' => env('CLIENT_SECRET'),
        'scope' => '*',
    ],

    // 访问令牌有效期(天)
    'tokensExpireIn' => 15,

    // 刷新后的访问令牌有效期(天)
    'refreshTokensExpireIn' => 30,
];
  • 运行migrate命令生成表
php artisan migrate
  • 生成访问秘钥
php artisan passport:install
  • 在模型中添加引用
use HasApiTokens, Notifiable;
  • 在Providers/AuthServiceProvider中的boot方法中添加访问路由
public function boot()
    {
        $this->registerPolicies();
        //注册发出访问令牌并撤销访问令牌、客户端和个人访问令牌所必需的路由
        Passport::routes();
        // 定义令牌作用域
       Passport::tokensCan(config('passport.scopes'));
       // 访问令牌有效期(天)
       Passport::tokensExpireIn(now()->addDays(15));
       // 刷新后的访问令牌有效期(天)
       Passport::refreshTokensExpireIn(now()->addDays(30));
    }
  • 在config/auth.php中设置驱动
'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

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

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\Login::class,
        ],
  • 请求获取token
public function getToken($username, $password)
    {
        $data = [
            'username' => $username,
            'password' => $password,
            'scope' => config('passport.default.scope'),
            'client_id' => config('passport.default.client_id'),
            'client_secret' => config('passport.default.client_secret')'grant_type' = 'password'
        ];
        $http = new Client();
        try {
             $result = $http->post(url('/oauth/token'), [
                     'form_params' => $data,
             ]);
        } catch (\Exception $e) {
             \Log::error('申请密码令牌失败:字段信息为:' . json_encode($data) . '错误:' . $e->getMessage());
             $error = explode("\n", $e->getMessage())[1];
             if ($error[strlen($error) - 1] != '}') {
                   $error = $error . '"}';
            }
            if (empty(json_decode($error))) return ['success' => false, 'message' => '服务器异常,请联系管理员'];
            switch (json_decode($error)->error) {
                      case 'invalid_grant':
                                  $errorMessage = '用户名或密码错误!';
                                break;
                    case 'invalid_client':
                    case 'invalid_request':
                                $errorMessage = '客户端出错,请重新下载!';
                                break;
                   default:
                                   $errorMessage = '未知错误,请联系管理员!';
                                break;
            }
            return ['success' => false, 'message' => $errorMessage];
         }            
    $token = json_decode((string)$result->getBody(), true)['access_token'];
    return ['status' => true, 'token' => $token];
}
  • 更改登录字段
在用户模型添加
// 自定义授权用户名(默认为登录账号)
    public function findForPassport($username)
    {
        return Admin::where('tel', $username)->first();
        // 也可以使用多字段登录
        return Admin::where('tel', $username)->orWhere('name', $username)->first();
    }
  • 如果你的用户表是使用的guid
请使用migrate文件修改 possport 表字段, 在之前,请安装 doctrine/dbal 拓展
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2

file在这里,要怎么自定义验证的数据库,我在上面重连数据库实现不了。

4年前 评论

楼主,可以看下我的问题出在哪了吗?谢谢

11个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!