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

2018-03-04sad creeper

最近在做一个前后端分离的项目,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);

阅读 1074 评论