Laravel Passport生成授权令牌时提示客户端认证失败如何解决
Laravel Passport 授权码模式客户端认证失败解决方案
invalid_client 错误本质是9000端口的服务端Passport校验客户端提交的身份参数时,发现和服务端存储的客户端信息不匹配导致的,常见原因和修复方案如下:
常见原因
- 客户端ID不匹配:代码中使用的
client_id=2,需要确认服务端数据库oauth_clients表中是否存在ID为2的记录,且该客户端类型为授权码模式客户端 - 客户端密钥不匹配:需要确认
oauth_clients表中ID为2的记录的secret字段值,和代码中填写的2DhRkOXmFHyNCY1k4mRhbRrR1TYP7pL77REruWT0完全一致,注意大小写、前后无多余空格 - 回调地址不匹配:服务端存储的客户端回调地址必须和代码中填写的
redirect_uri完全一致,包括协议(http/https)、地址(127.0.0.1不能写成localhost)、端口、路径,哪怕末尾多一个斜杠都会校验失败 - 客户端为公开类型:如果你创建客户端时加了
--public参数,该客户端没有密钥,提交client_secret反而会触发校验失败 - 服务端配置异常:服务端未执行
passport:keys生成公钥私钥,或者配置、路由存在缓存导致参数读取错误
修复步骤
- 核对服务端客户端信息:登录服务端应用的数据库,执行查询语句确认参数匹配:
SELECT id, secret, redirect FROM oauth_clients WHERE id = 2;
- 若参数不匹配:要么修改代码中的参数和数据库存储的一致,要么重新生成符合要求的客户端。在服务端执行以下命令创建新的授权码客户端:
php artisan passport:client --name="测试授权码客户端" --redirect_uri="http://127.0.0.1:8000/authorize/response"
执行命令后会输出新的client_id和client_secret,替换代码中的对应值即可。
3. 若为公开客户端:直接删除oauth/token请求参数里的client_secret字段即可。
4. 清理服务端缓存:执行以下命令清理配置和路由缓存,同时确认公钥私钥存在:
# 清理缓存 php artisan config:clear php artisan route:clear # 确认公钥私钥存在,不存在则生成 php artisan passport:keys
内容的提问来源于stack exchange,提问作者Venelin
相关产品推荐
相关产品推荐

