Azure ADB2C Google注册报错AADB2C90090:JWE不是有效5段令牌
问题核心表现
- 场景:React Native 应用内嵌 WebView 调用 Azure AD B2C SignInSignUp 用户流,配置Google作为第三方身份提供商
- 异常:用户完成Google侧注册/授权操作后,回调URL的
code字段返回Google原生授权码,而非B2C签发的格式化令牌;解析StateProperties字段时抛出错误:AADB2C90090: The provided JWE is not a valid 5 segment token. - 对照基线:同用户流下,Apple身份提供商注册、B2C本地账号“立即注册”流程均能返回格式合规、可通过服务端校验的令牌
- 报错本质:B2C的令牌解析逻辑收到了非自身签发的code值,不符合JWE 5段结构(头、载荷、加密密钥、初始化向量、认证标签)要求,和令牌解析逻辑本身无关
根因范围
由于Apple、本地账号流程完全正常,可直接排除B2C用户流本身的令牌签发逻辑、应用端回调解析逻辑的问题,故障锁定在Google身份提供商的双边配置、授权链路跳转环节:
- 最常见原因:Google Cloud Console 中OAuth客户端的授权重定向URI配置错误,Google授权完成后没有将授权码发送给B2C的令牌交换端点,直接回传给了客户端WebView,B2C没有完成「Google授权码→B2C令牌」的兑换流程
- 次常见原因:B2C侧Google身份提供商配置错误(客户端ID/密钥不匹配、响应类型选错、作用域配置异常),导致B2C拿到Google授权码后无法向Google令牌端点发起兑换请求,流程异常中断后直接透传了原始Google授权码
- 特殊场景:WebView拦截了B2C域的跳转请求、阻止了第三方Cookie,导致B2C会话丢失,无法完成授权码兑换流程;或新建Google OAuth客户端存在配置同步延迟,导致B2C换令牌请求被Google拒绝
排查步骤(按优先级排序)
- 核对双边重定向配置
- 进入Google Cloud Console对应OAuth 2.0客户端配置页,确认授权重定向URI严格匹配B2C Google IdP配置页给出的官方回调地址,格式为
https://<你的B2C租户名>.b2clogin.com/<你的B2C租户名>.onmicrosoft.com/oauth2/authresp,无多余斜杠、大小写错误、后缀参数 - 确认没有混用调试/发布版Google OAuth客户端ID,安卓端需确认包名、SHA1签名和客户端配置完全匹配
- 进入Google Cloud Console对应OAuth 2.0客户端配置页,确认授权重定向URI严格匹配B2C Google IdP配置页给出的官方回调地址,格式为
- 核对B2C侧Google IdP配置
- 确认客户端ID、客户端密钥与Google Cloud Console中值完全一致,无前后空格、复制错误
- 确认作用域仅勾选
openid、email、profile三个基础项,未添加Google专属非标准作用域 - 确认响应类型配置为
code(授权码流),未勾选隐式流直接返回id_token/access_token的选项
- 链路校验
- 开启React Native WebView请求日志,跟踪Google授权完成后的跳转路径:正常流程为Google 302跳转至B2C的authresp端点,再由B2C跳转至应用配置的回调地址;如果Google授权后直接跳转到应用回调地址,可直接判定为重定向URI配置错误
- 查看B2C审计日志,确认Google IdP登录流程的失败节点,定位是否存在「授权码兑换失败」「客户端凭证无效」类明确报错
- WebView配置校验
- 确认WebView未拦截
b2clogin.com、google.com域下的跳转请求 - 确认未开启全局阻止第三方Cookie配置,B2C完成Google授权码兑换依赖跨域Cookie传递
- 确认WebView未拦截
可直接落地的解决方案
- 配置类问题:修正重定向URI、客户端ID/密钥后,等待5-10分钟让B2C、Google双侧配置生效后重新测试;新建Google OAuth客户端存在最长1小时的配置同步延迟,等待后重试即可
- WebView配置修正参考:
<WebView source={{ uri: b2cLoginEndpoint }} sharedCookiesEnabled={true} thirdPartyCookiesEnabled={true} // 安卓端必须开启,否则跨域Cookie丢失 onShouldStartLoadWithRequest={(event) => { // 仅拦截最终跳转到应用自定义Scheme的回调,不要拦截B2C、Google域的中间跳转 if (event.url.startsWith('yourscheme://auth-callback')) { handleB2cTokenResponse(event.url) return false } return true }} />
内容的提问来源于stack exchange,提问作者Jordan Burge
相关产品推荐
相关产品推荐

