Laravel Passport登录认证失败问题求助
问题描述
我使用Postman向
localhost/api/login提交用户名和密码时收到错误信息:{"error": "invalid_credentials", "message": "The user credentials were incorrect."}注册功能正常运行,我的LoginController代码如下:
private $client; public function __construct(){ $this->client = Client::find(1); } public function login(Request $request){ $this->validate($request, [ 'username' => 'required', 'password' => 'required' ]); return $this->issueToken($request, 'password'); }我的issueToken方法代码:
public function issueToken(Request $request, $grantType, $scope = ""){ $params = [ 'grant_type' => $grantType, 'client_id' => $this->client->id, 'client_secret' => $this->client->secret, 'scope' => $scope ]; if($grantType !== 'social'){ $params['username'] = $request->username ?: $request->email; } $request->request->add($params); $proxy = Request::create('oauth/token', 'POST'); return Route::dispatch($proxy); }请问问题出在哪里?
可能的排查方向
我帮你梳理几个大概率的问题点,结合你的代码逐一排查:
密码存储是否正确加密
注册正常但登录失败,首先要确认注册时密码是用Hash::make()加密后存入数据库的。如果注册时直接存了明文,Passport的密码验证逻辑肯定会失败。你可以去users表查看password字段,正常应该是一串长哈希字符串,而不是你注册时输入的明文密码。登录字段是否匹配
Laravel Passport的密码授权默认是用email作为用户名标识的(除非你特意修改了配置)。你的代码里把$request->username传给了params['username'],如果你的用户表实际是用email作为登录字段,而Postman里传的是username参数,或者反过来,就会找不到对应的用户。
可以试试在Postman里把请求参数改成email,或者调整issueToken里的逻辑,确保传递的字段和用户表的登录字段一致。OAuth客户端配置是否正确
你在构造函数里直接取了Client::find(1),要确认这个客户端的id和secret是正确的,而且该客户端支持password授权类型。去oauth_clients表看看,password_client字段是否为1(Passport里标识这是密码授权客户端)。请求参数的传递方式是否正确
Postman发送请求时,要把参数放在form-data或者x-www-form-urlencoded中,而不是raw的JSON格式。因为你的代码是从$request->request(表单请求参数)里取值,如果传的是JSON,可能导致$request->username取不到值,最终传给OAuth接口的用户名是空的,自然验证失败。临时调试看实际参数
最快的排查方式是在issueToken方法里加一行dd($params);,看看最终传给oauth/token的参数到底是什么,重点检查username、client_id、client_secret这些关键值是否正确,一眼就能定位参数问题。
内容的提问来源于stack exchange,提问作者more

