使用Keycloak作为OIDC接入Firebase时Nonce不匹配问题求助
解决Firebase + Keycloak OIDC认证中的NONCE不匹配错误
问题原因
Firebase的OIDC认证机制要求ID Token中的nonce字段必须是原始nonce值的SHA256哈希,且这个原始nonce需要在两个环节完全一致:
- 发起Keycloak授权请求时传递给Keycloak;
- 调用
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
相关产品推荐
相关产品推荐

