精易论坛

标题: laravel passport认证 轻松实现移动端与后端分离 [打印本页]

作者: dream518    时间: 2022-12-30 11:59
标题: 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




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


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? [zxsq-anti-bbcode-users]:
  [zxsq-anti-bbcode-0] users
  [zxsq-anti-bbcode-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中获取用户传过来的



开始测试 访问路由

在这里插入图片描述

成功获取到数据



至于如何携带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









欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4