You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Keycloak作为OIDC接入Firebase时Nonce不匹配问题求助

解决Firebase + Keycloak OIDC认证中的NONCE不匹配错误

问题原因

Firebase的OIDC认证机制要求ID Token中的nonce字段必须是原始nonce值的SHA256哈希,且这个原始nonce需要在两个环节完全一致:

  1. 发起Keycloak授权请求时传递给Keycloak;
  2. 调用provider.credential()时通过rawNonce参数传入Firebase。

你的代码缺少nonce的生成、传递和关联环节,即使尝试添加rawNonce,也因传入值与Keycloak授权请求的原始nonce不一致导致错误。

解决方案

1. 生成并传递Nonce到Keycloak

在跳转到Keycloak授权页面前,生成随机nonce并存储,同时将其作为参数附加到Keycloak的授权URL中:

// 生成安全随机的nonce
const nonce = crypto.randomUUID();
// 存储到sessionStorage以便后续使用
sessionStorage.setItem('nonce', nonce);

// 构造Keycloak授权URL,添加nonce参数
const keycloakAuthUrl = `https://your-keycloak-domain/auth/realms/your-realm/protocol/openid-connect/auth?client_id=your-client-id&redirect_uri=${encodeURIComponent(window.location.origin + '/your-redirect-path')}&response_type=code&scope=openid%20profile%20email&nonce=${nonce}`;

// 跳转到Keycloak授权页
window.location.href = keycloakAuthUrl;

2. 修正Firebase认证代码

在获取到Keycloak返回的accessToken和idToken后,取出之前存储的原始nonce,传入provider.credential():

const access = sessionStorage.getItem('accessToken');
const idToken = sessionStorage.getItem('idToken');
const rawNonce = sessionStorage.getItem('nonce');

const provider = new OAuthProvider('oidc.kc-dev');

// 修正原代码变量名错误:id_token改为idToken
const credential = provider.credential({
  idToken: idToken,
  accessToken: access,
  rawNonce: rawNonce, // 关键:传入和授权请求一致的原始nonce
});

signInWithCredential(getAuth(), credential)
  .then((result) => {
    const credential1 = OAuthProvider.credentialFromResult(result);
    console.log(credential1);
  })
  .catch((error) => {
    console.error('认证失败:', error);
  });

3. 检查Keycloak客户端配置

  • 进入Keycloak控制台,找到目标客户端,切换到Advanced标签页;
  • 确保Nonce Required选项处于开启状态(禁用该选项会导致Keycloak不返回nonce字段,Firebase仍会校验并报错)。

额外注意事项

  • 不要使用固定nonce或重复值,必须每次认证生成新的随机nonce,避免安全风险;
  • 确保redirect_uri已添加到Keycloak客户端的Valid Redirect URIs列表中;
  • 原代码中存在变量名错误(id_token应为idToken),需同步修正。

内容的提问来源于stack exchange,提问作者Aditya Pol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:20:04