在 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年前 自动加精
高认可度评论:
https://github.com/laravel/passport/issues... 这种处理方法可能更好一些
我最近也想用
passport
来实现短信快速登录。想请问下思路是不是这样: 1.用手机号获得验证码, 将手机号和验证码和有效时间存起来 2.用户登录的时候,将手机号和验证码发送给自己的一个接口,然后通过手机号获得它的密码。3.就是你所说的那样,用加密的密码进行校验。@tiandaye 对,我是这么做的
@SadCreeper 谢谢。
https://github.com/laravel/passport/issues... 这种处理方法可能更好一些
@liyu001989 666,这哥们怕是读了源码的
@liyu001989 666 :kissing_heart:
@liyu001989 大兄弟,厉害了~ :+1:
@liyu001989 使用auth能实现手机验证码登录么
@TF 你是说使用 passport 能不能实现手机验证码登录? 我看你买了 api 的课程了啊,里面有讲啊
@liyu001989 不是使用passport能不能实现手机验证码登录,我是想问使用laravel自带的Auth能实现通过手机验证码登录么,用户只输入手机号码获取验证码来通过auth验证实现登录。我看这篇文章提到在 User 模型中重写密码验证方法,是不是也可以重写auth的密码验证方法,可是我找了半天没找到auth的密码验证在哪实现的。
@TF 你可以完成你自己的验证,然后登录这个用户即可,记录session 或者返回token。实现你自己的 guard 需要了解源码先,google一下吧,资料挺多的。
@liyu001989 嗯 好的 谢谢
刚好实现这个功能,对我很有帮助,👍
个人感觉, Pssport 的用处在于, 第三方授权. 要是做和 应用客户端 交互之类的功能, 还是用 jwt 比较靠谱.