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 评论