如何解决LinkedIn OIDC与Firebase Auth/GCP身份平台的适配问题?
解决LinkedIn OIDC与Firebase Auth/GCP Identity Platform集成问题
核心问题
LinkedIn新版OIDC登录的配置文件路径不符合OpenID Connect规范(未托管在%issuer%/.well-known/openid-configuration,而是在%issuer%/oauth/.well-known/openid-configuration),导致Firebase Auth的自动发现机制无法识别,无法直接通过标准OIDC配置完成集成。
可行解决方案
方案1:自定义令牌流程(推荐,无额外依赖)
绕过Firebase Auth的自动OIDC发现,手动完成LinkedIn认证后生成Firebase自定义令牌实现登录:
- 前端操作:
- 直接对接LinkedIn OIDC授权流程,获取用户的
id_token及基础信息 - 将
id_token发送到你的后端服务
- 直接对接LinkedIn OIDC授权流程,获取用户的
- 后端操作:
- 验证LinkedIn的
id_token有效性:- 手动从LinkedIn OIDC配置中提取
jwks_uri对应的公钥 - 验证Token的签名、过期时间、issuer等核心字段
- 手动从LinkedIn OIDC配置中提取
- 借助Firebase Admin SDK生成自定义令牌,用LinkedIn用户ID作为Firebase UID的标识前缀
- 验证LinkedIn的
- 前端完成登录:
接收后端返回的自定义令牌,调用firebase.auth().signInWithCustomToken(token)完成Firebase Auth登录
Node.js后端代码示例:
const admin = require('firebase-admin'); const jwt = require('jsonwebtoken'); const fetch = require('node-fetch'); // 验证LinkedIn ID Token async function verifyLinkedInIdToken(idToken) { const jwksResponse = await fetch('https://www.linkedin.com/oauth/.well-known/jwks.json'); const jwks = await jwksResponse.json(); const publicKey = jwks.keys[0].x5c[0]; return jwt.verify(idToken, publicKey, { issuer: 'https://www.linkedin.com', audience: '你的LinkedIn客户端ID' }); } // 生成Firebase自定义令牌 async function generateFirebaseCustomToken(linkedInUser) { const uid = `linkedin:${linkedInUser.sub}`; return admin.auth().createCustomToken(uid, { name: linkedInUser.name, email: linkedInUser.email }); } // 接口示例 app.post('/auth/linkedin', async (req, res) => { const { idToken } = req.body; try { const verifiedUser = await verifyLinkedInIdToken(idToken); const customToken = await generateFirebaseCustomToken(verifiedUser); res.json({ customToken }); } catch (error) { res.status(401).json({ error: 'Invalid LinkedIn token' }); } });
方案2:反向代理重写配置路径
部署反向代理服务,将标准路径的请求转发到LinkedIn的实际配置地址,让Firebase Auth能正常读取配置:
- 操作步骤:
- 部署轻量服务(如GCP Cloud Functions、Cloud Run或Nginx)
- 配置路由:当请求
/你的代理路径/.well-known/openid-configuration时,转发到https://www.linkedin.com/oauth/.well-known/openid-configuration - 在Firebase Auth的OIDC提供商配置中,将
issuer设置为你的代理服务地址(确保该地址可被Firebase访问)
Cloud Functions代码示例(Node.js):
const functions = require('firebase-functions'); const fetch = require('node-fetch'); exports.proxyLinkedInOIDC = functions.https.onRequest(async (req, res) => { if (req.path === '/.well-known/openid-configuration') { const linkedInConfig = await fetch('https://www.linkedin.com/oauth/.well-known/openid-configuration'); const configData = await linkedInConfig.json(); // 修改issuer为代理地址,避免Firebase验证不匹配 configData.issuer = '你的Cloud Function地址'; res.json(configData); } else { res.status(404).send('Not Found'); } });
配置完成后,在Firebase Auth中添加OIDC提供商,填写代理地址作为issuer,其余client ID、client secret使用LinkedIn应用的对应信息即可。
注意事项
- 方案1灵活性更高,完全可控,适合绝大多数场景
- 方案2需要维护额外代理服务,但无需修改前端认证流程
- 无论采用哪种方案,都要确保LinkedIn应用的回调URL配置正确,且Firebase Auth的权限设置符合业务需求
内容的提问来源于stack exchange,提问作者abegehr
相关产品推荐
相关产品推荐

