Laravel Passport授权码模式无法获取Token问题求助
我在使用Laravel Passport的授权码模式换取Token时,按官方流程实现请求后返回以下错误:
"error": "invalid_request",
"error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.",
"hint": "Cannot decrypt the authorization code",
"message": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed."
请求代码如下:
$response = Http::asForm()->post('http://passport-app.test/sso/oauth/token', [ 'grant_type' => 'authorization_code', 'client_id' => env('CLIENT_ID'), 'client_secret' => env('CLIENT_SECRET'), 'redirect_uri' => env('REDIRECT_URI'), 'code' => $request->code, ]); return $response->json();
排查及解决步骤
1. 核对客户端ID一致性
确保换取Token使用的client_id和生成授权码时的客户端ID完全匹配。授权码与生成它的客户端绑定,跨客户端使用会导致解密失败。可查看oauth_clients表确认客户端ID。
2. 统一加密密钥
Passport用服务端的APP_KEY加密授权码,若服务端APP_KEY变更,或客户端与服务端密钥不一致,都会触发解密失败。检查服务端.env的APP_KEY,确保和生成授权码时的密钥一致。
3. 验证授权码有效性
授权码默认10分钟有效期且仅能使用一次,过期或重复使用都会失效。重新发起授权流程获取新的授权码后再尝试请求。
4. 匹配重定向URI
请求中的redirect_uri必须与创建客户端时填写的重定向URI完全一致(包括协议、域名、路径,大小写敏感)。查看oauth_clients表的redirect字段,确保参数值完全匹配。
5. 检查授权码完整性
确认$request->code正确获取到了授权码,没有被转义、截断或为空。可以用dd($request->code)打印验证。
6. 确认Passport配置完整性
- 确保已执行
php artisan passport:install生成必要的加密密钥和客户端 - 确认用户模型(如
App\User)引入了Laravel\Passport\HasApiTokenstrait - 检查
config/auth.php中guards.api.driver是否设置为passport
内容的提问来源于stack exchange,提问作者Armin Jaberi

