laravel passport认证 轻松实现移动端与后端分离

基于laravel8创建passport 移动端认证

第一步:安装passport

composer require laravel/passport

第二步:迁移数据库 passport会自动创建多张表
包括一张users表 具体会不会覆盖原来的users同名表不太清楚 建议先把同名表改成别的名字

php artisan migrate

第三步:创建生成安全访问令牌(token)所需的加密键,此外,该命令还会创建“personal access”和“password grant”客户端用于生成访问令牌

php artisan passport:install

以上是基础操作
接下来才是我需要的步骤 因为我主要用passport验证移动端 后端系统管理还是用的session

  • 将passport创建的users表改名为members 之前修改的同名表再改回去

第一步 移动端是面向用户的 创建用户模型

php artisan make:model Models/Member 

第二步 member 模型内容
添加 Laravel\Passport\HasApiTokens trait 到 member模型
该 trait 将会为模型类提供一些辅助函数用于检查认证用户的 token 和 scope

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Sanctum\HasApiTokens;
class Member extends Authenticatable
{
    use HasApiTokens, HasFactory;
    protected $table = 'members'; //指定表名members
    public function findForPassport($username){
    //设置验证的账号键
        return $this->where('username',$username)->first();
    }
}

第三步 在app/providers/AuthServiceProviderboot方法中调用Passport::routes方法,该方法将会为颁发访问令牌、撤销访问令牌、客户端以及私人访问令牌注册必要的路由

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

        Passport::routes();
    }

第四步 在配置文件 config/auth.php 中,需要设置 api 认证 guard 的 driver 选项为 passport。这将告知应用在认证输入的 API 请求时使用 Passport 的 TokenGuard

provider 加上member

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'passport',
            'provider' => 'members',
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
        'members' => [
            'driver' => 'eloquent',
            'model' => App\Models\Member::class,
        ]
        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

第五步 注册移动端应用

php artisan passport:client --password
PS E:\phpstudy_pro\WWW\wechat> php artisan passport:client --password

 What should we name the password grant client? [Laravel Password Grant Client]:
 > members

 Which user provider should this client use to retrieve users? [users]:
  [0] users
  [1] members
 > 1

Password grant client created successfully.
Client ID: 3
Client secret: VFHqu0yB9xdiaO8T146855fFAzdynQO6Xp8ypyUQ

第六步 将获取到的clientid 与secret 保存到env文件中

CLIENT_ID=3
CLIENT_SECRET=VFHqu0yB9xdiaO8T146855fFAzdynQO6Xp8ypyUQ

第七步 在config/services.php中新增配置项

'members' => [
    'appid' => env('CLIENT_ID'),
    'secret' => env('CLIENT_SECRET'),
]

第八步 创建登录路由 routes/api.php

Route::get('/auth/password', function (Request $request){
    $http = new \GuzzleHttp\Client();
    try {
        $response = $http->post($request->root().'/oauth/token',[
            'form_params' => [
                'grant_type' => 'password',
                'client_id' => config('services.members.client_id'),
                'client_secret' => config('services.members.client_secret'),
                'username' => 'member123',
                'password' => '123456',
                'scope' => '*',
            ],
        ]);
    } catch (RequestException $requestExcepion) {
        return json_encode(['code'=>401,'msg'=>'账号登陆失败,请重试!']);
    }
    if($response->getStatusCode() == 401){
        return json_encode(['code'=>401,'msg'=>'账号登陆失败,请重试!']);
    }
    return json_encode(['code'=>200,'data'=>json_decode((string)$response)]);
});

简化测试了 实际 username和password需要在request中获取用户传过来的

开始测试 访问路由
在这里插入图片描述
成功获取到数据

  • 返回结果中包含四个字段,access_token 是授权令牌,token_type 表示认证类型是 Bearer,我们可以将这个 access_token 值设置到 Bearer Authentication 请求头去请求需要认证的后端 API 接口。refresh_token 在令牌过期后刷新令牌时使用,最后 expires_in 表示令牌有效期(单位是秒,即有效期一年)

至于如何携带token访问与如何获取访问用户的数据

在请求头中添加Authorization 内容为

Bearer +你的token  注意Bearer后面有一个空格
Route::namespace('Member')->middleware('auth:api')->group(function(){
    Route::get('user',function(){
        $res = \Auth::user();//是的直接用Auth就能获取到!~!
        var_dump($res);
        return '成功';
    });
});

在这里插入图片描述

特别注意 !!!!!!
middleware中使用auth中间件一定要带上:api 如上代码
禁止使用passport的页面 也要改
比如 我的系统后台写在web.php中 那么web中的路由middleware 要写上 auth:web 不然用户在移动端登陆后 拿着token可以访问系统后台!!! 如下代码

// 后台系统
Route::namespace('Admin')->middleware(['auth:web','admin_auth'])->group(function(){
 // 后台主页
}

总结
不要把passport想象的太神秘了 laravelyyds

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值