Laravel Passport 自定义获取授权用户的实现方案

教程 JobsLong ⋅ 于 1年前 ⋅ 最后回复由 MasterShu 6个月前 ⋅ 8779 阅读

最近有个项目使用了 Laravel Passport 来实现后端 API 的授权过程,整体用起来还是还顺利的,不过有个细节文档里面也并没有写,可以分享一下。

正常业务中,我们在通过请求中的 credentials 获取用户的时候,实际业务经常可能需要支持多个字段登入(比如同时去检查邮箱或者手机号码的匹配),或者需要检测用户是否被禁用之类的逻辑,可以统称为获取授权用户业务逻辑。

在 Laravel Passport 的源码中其实已经相应的去检查的对应 Guard 的 model 是否存在一个 findForPassport 方法:

# ./vendor/laravel/passport/src/Bridge/UserRepository@getUserEntityByUserCredentials

if (method_exists($model, 'findForPassport')) {
    $user = (new $model)->findForPassport($username);
} else {
    $user = (new $model)->where('email', $username)->first();
}

所以我们只需要给在 config/auth.php 配置的 Guard 对应的资源 model 添加一个 findForPassport 就方法可以,而不用再去通过中间件或者其他的方式实现:

# app\User.php

// 通过 phone 查找没有在禁用状态下的用户:
public function findForPassport($username)
{
    return \App\User::normal()
        ->where('phone', $username)
        ->first();
}

public function scopeNormal($query)
{
    return $query->where('status', self::STATUS_NORMAL);
}

Done!

优帆远扬 —— 创造不息,交付不止

本帖已被设为精华帖!
本帖由 Summer 于 1年前 加精
回复数量: 9
  • Payne
    1年前

    :+1:
    Laravel Passport 用起来不如dingo API吧?

  • thankuu
    1年前

    最近也折腾了使用Laravel Passport来构造后端api,也用了楼主相同的方法,不知道楼主架设的具体结构是如何,想请教一下,针对授权这一块的流程

  • JobsLong 那么,下一步的行动是什么?
    1年前

    @Payne 相对而言,dingo 更强大一点,功能比较多了点,包括 Transformer,异常处理,Laravel Passport 只是拿来处理 API 授权过程;

  • JobsLong 那么,下一步的行动是什么?
    1年前

    @thankuu 这一你是指 OAuth 2.0 或者 JWT Token 的一些处理流程和使用方式吗?可以在社区里面搜索一下,这方面的讨论还是蛮多的

  • shijunti19
    1年前

    你知道怎么获取当前授权用户的信息吗?

  • xiao345
    9个月前

    @JobsLong 如何拿到当前用户的授权信息?我用手机+短信验证码登录 ,或者用第三方登录,没有提供密码,这样passport的password模式好像没法破,之前用JWT可以手动生成token,passport是怎么做的?

  • sowork
    7个月前

    @xiao345 同求解决方案

  • gwl
    7个月前

    @xiao345 文档上有
    $user = App\User::find(1);

    // Creating a token without scopes...
    $token = $user->createToken('Token Name')->accessToken;

    // Creating a token with scopes...
    $token = $user->createToken('My Token', ['place-orders'])->accessToken;

  • MasterShu
    6个月前

    @gwl 文档的啥子地方啊,我没发现呐!

暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
Ctrl+Enter