使用omniauth_openid_connect gem认证失败:Client credentials are invalid求助
以下是针对该问题的具体排查步骤:
排查Discovery模式与手动配置的冲突
你同时开启了discovery: true和手动配置了authorization_endpoint、token_endpoint等地址,部分身份提供商的Discovery文档返回的端点可能与手动配置不一致,导致请求发送到错误地址。建议暂时注释掉所有手动配置的端点字段,让gem自动从.well-known/openid-configuration拉取正确的端点地址,测试是否能正常获取token。强制设置客户端凭证的认证方式
部分IDP要求在Token请求中通过HTTP Basic Auth传递client_id和client_secret,而非放在请求体里。你可以在client_options中添加auth_scheme: :basic_auth,强制使用Basic Auth方式传递凭证:client_options: { # 其他配置... auth_scheme: :basic_auth }验证Redirect URI的精确匹配
身份提供商后台配置的Redirect URI必须与代码中的redirect_uri完全一致,包括域名、路径、末尾斜杠、HTTP/HTTPS协议等。检查#{ConfigSettings.api.base_url}front_end/users/auth/openid_connect/callback拼接后的完整地址,是否和IDP后台配置的一字不差。检查Scope参数的格式与要求
你设置了send_scope_to_token_endpoint: false,但部分IDP要求在Token请求中必须携带Scope参数。另外,尝试将Scope从符号数组改为字符串数组,避免潜在格式问题:scope: ["openid", "profile", "groups_rewardops", "scope_rewardops"]同时确认这些Scope已在IDP后台为你的客户端授权。
确认Issuer地址的正确性
检查ConfigSettings.desjardins.issuer_url是否与IDP的Discovery文档中的issuer字段完全一致,包括是否带有末尾斜杠、域名拼写等细节,Issuer不匹配也可能导致凭证验证失败。查看Token请求的详细日志
开启详细日志排查实际发送的请求内容:
在config/initializers/devise.rb或单独的OmniAuth初始化文件中添加:OmniAuth.config.logger = Rails.logger Rails.logger.level = :debug查看日志中Token请求的URL、请求头和请求体,确认
client_id和client_secret是否正确传递,请求格式是否符合IDP要求。也可以用抓包工具直接查看请求详情。检查IDP客户端的后台配置
确认IDP后台的客户端配置:- 是否启用了
authorization_code授权流程(你使用的response_type: :code) - 客户端是否处于激活状态
- 是否设置了IP白名单等限制,导致请求被拦截
- 客户端是否被授权使用指定的Scope
- 是否启用了
内容的提问来源于stack exchange,提问作者svelandiag

