在 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 协议》,转载必须注明作者和本文链接
本帖由系统于 2年前 自动加精
SadCreeper
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 14

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

2年前 评论

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

2年前 评论
SadCreeper

@tiandaye 对,我是这么做的

2年前 评论

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

2年前 评论
SadCreeper

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

2年前 评论

@liyu001989 大兄弟,厉害了~ :+1:

2年前 评论

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

1年前 评论

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

1年前 评论

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

1年前 评论

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

1年前 评论

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

1年前 评论

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

9个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!