开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 399|回复: 0
收起左侧

[PHP相关教程] laravel passport认证 轻松实现移动端与后端分离

[复制链接]
发表于 2022-12-30 11:59:19 | 显示全部楼层 |阅读模式   山东省德州市

基于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

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表