在 Laravel 中使用 Passport 实现短信登录 API 验证

最近在做一个前后端分离的项目,API服务器使用了 Laravel ,API认证使用了 Passport 的密码验证方式

在做手机验证码登录(忘记密码)时遇到了一个问题,服务器拿不到明文密码,没法获取 token

翻了几篇 Laravel-China 社区的文章,有人提到使用个人访问令牌中提供的方法获取 token:

$token = $user->createToken('Token Name')->accessToken;

使用这种方法会创建一个个人访问令牌,而且这个令牌是永久的,如果不想用个人令牌怎么办呢,经过尝试,发现了一个比较曲折的办法:既然拿不到明文密码,那就直接用数据库里存的哈希后的密码来验证,也就是重写密码验证函数

在 User 模型中重写密码验证方法:

public function validateForPassportPasswordGrant($password)
{
    return $password == $this->password || Hash::check($password, $this->password);
}

同时需要在顶部添加 Hash 依赖:

use Illuminate\Support\Facades\Hash;

修改后,使用明文密码或者Hash过后的密码都可以进行登录了,然后就很简单了,在控制器中需要登陆的地方,使用 Guzzle 发送请求,获取 token,然后再返回给客户端即可:

$http = new GuzzleHttp\Client;
$response = $http->post('http://yourweb.test/oauth/token', [
    'form_params' => [
            'grant_type' => 'password',
            'client_id' => '2',
            'client_secret' => 'abc',
            'username' => '用户名',
            'password' => '数据库中保存的密码',
            'scope' => '',
    ],
]);
return json_decode((string) $response->getBody(), true);

原文链接:http://dmmylove.cn/articles/14

本作品采用《CC 协议》,转载必须注明作者和本文链接
长路漫漫,唯键盘作伴。:octocat: 我是猫哥,欢迎关注我的 「个人博客 」和微信公众号「前端猫哥」 :new_moon_with_face:
本帖由系统于 6年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 14
liyu001989

https://github.com/laravel/passport/issues... 这种处理方法可能更好一些

6年前 评论

我最近也想用 passport 来实现短信快速登录。想请问下思路是不是这样: 1.用手机号获得验证码, 将手机号和验证码和有效时间存起来 2.用户登录的时候,将手机号和验证码发送给自己的一个接口,然后通过手机号获得它的密码。3.就是你所说的那样,用加密的密码进行校验。

6年前 评论
前端猫哥

@tiandaye 对,我是这么做的

6年前 评论
liyu001989

https://github.com/laravel/passport/issues... 这种处理方法可能更好一些

6年前 评论
前端猫哥

@liyu001989 666,这哥们怕是读了源码的

6年前 评论

@liyu001989 使用auth能实现手机验证码登录么

5年前 评论
liyu001989

@TF 你是说使用 passport 能不能实现手机验证码登录? 我看你买了 api 的课程了啊,里面有讲啊

5年前 评论

@liyu001989 不是使用passport能不能实现手机验证码登录,我是想问使用laravel自带的Auth能实现通过手机验证码登录么,用户只输入手机号码获取验证码来通过auth验证实现登录。我看这篇文章提到在 User 模型中重写密码验证方法,是不是也可以重写auth的密码验证方法,可是我找了半天没找到auth的密码验证在哪实现的。

5年前 评论
liyu001989

@TF 你可以完成你自己的验证,然后登录这个用户即可,记录session 或者返回token。实现你自己的 guard 需要了解源码先,google一下吧,资料挺多的。

5年前 评论

刚好实现这个功能,对我很有帮助,👍

5年前 评论

个人感觉, Pssport 的用处在于, 第三方授权. 要是做和 应用客户端 交互之类的功能, 还是用 jwt 比较靠谱.

4年前 评论

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