部署Jumbojett OpenID Connect时遇Unable to verify JWT claims错误求助
问题场景
本地开发环境运行正常,但部署到服务器后持续抛出以下异常:
捕获到未处理异常
类型: Jumbojett\OpenIDConnectClientException
信息: Unable to verify JWT claims
文件名: /var/www/html/vendor/jumbojett/openid-connect-php/src/OpenIDConnectClient.php
行号: 373
回溯信息:
文件: /var/www/html/application/controllers/Welcome.php
行号: 56
方法: authenticate
文件: /var/www/html/index.php
行号: 315
方法: require_once
认证代码
$oidc = new OpenIDConnectClient( $this->config->item('SSO_PROVIDER_URL'), $this->config->item('SSO_CLIENT_ID'), $this->config->item('SSO_CLIENT_SECRET') ); $oidc->setVerifyHost(false); //dev only $oidc->setVerifyPeer(false); //dev only $oidc->setHttpUpgradeInsecureRequests(false); //dev only $isAuthenticate = $oidc->authenticate();
配置项(已脱敏)
$config['SSO_PROVIDER_URL'] = 'https://auth.****.**.id/auth/realms/***ura-**st'; $config['SSO_CLIENT_ID'] = '***ola-****'; $config['SSO_CLIENT_SECRET'] = '********************************';
可能的原因及解决方法
服务器时间与IDP时间偏差过大
JWT的exp(过期时间)和nbf(生效时间)验证对时间敏感,若服务器本地时间和身份提供商(IDP)服务器时间差超过5分钟,就会触发验证失败。
解决:同步服务器时间到NTP服务器,比如CentOS执行chronyc makestep,Ubuntu执行timedatectl set-ntp true。IDP的JWKS端点无法访问
库会自动从IDP的well-known端点获取JWKS密钥验证JWT签名,服务器可能因防火墙、代理限制无法访问该端点。
解决:- 手动访问
你的IDP_URL/.well-known/openid-configuration,确认jwks_uri字段存在且可访问; - 在服务器上用curl测试:
curl https://auth.****.**.id/auth/realms/***ura-**st/protocol/openid-connect/certs(替换成实际jwks地址),检查是否返回JSON格式密钥; - 若有代理,给客户端设置代理:
$oidc->setProxy('http://你的代理地址:端口');。
- 手动访问
受众(Audience)验证不匹配
JWT的aud字段必须包含你的SSO_CLIENT_ID,若IDP配置的受众与客户端ID不一致,会导致验证失败。
解决:- 检查IDP后台客户端配置,确认
Valid Audiences包含你的SSO_CLIENT_ID; - 代码中手动指定受众:
$oidc->setAudience($this->config->item('SSO_CLIENT_ID'));。
- 检查IDP后台客户端配置,确认
签名算法不匹配
IDP签名JWT使用的算法与库预期不一致(比如IDP用RS256但库默认用HS256),会导致验证失败。
解决:- 查看IDP的openid-configuration里的
id_token_signing_alg_values_supported字段,确认签名算法; - 代码中手动设置算法:
$oidc->setSigningAlgorithm('RS256');(替换为实际算法)。
- 查看IDP的openid-configuration里的
SSL证书相关隐藏问题
即使禁用了证书验证,服务器CA证书过期或不完整也可能导致无法获取JWKS。
解决:- 更新服务器CA证书包,CentOS执行
yum update ca-certificates,Ubuntu执行update-ca-certificates; - 开启调试模式查看详细错误:
$oidc->setDebug(true);,根据输出定位具体验证失败步骤。
- 更新服务器CA证书包,CentOS执行
内容的提问来源于stack exchange,提问作者Codeboy Newbie

