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

如何解决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自定义令牌实现登录:

  • 前端操作:
    1. 直接对接LinkedIn OIDC授权流程,获取用户的id_token及基础信息
    2. 将id_token发送到你的后端服务
  • 后端操作:
    1. 验证LinkedIn的id_token有效性:
      • 手动从LinkedIn OIDC配置中提取jwks_uri对应的公钥
      • 验证Token的签名、过期时间、issuer等核心字段
    2. 借助Firebase Admin SDK生成自定义令牌,用LinkedIn用户ID作为Firebase UID的标识前缀
  • 前端完成登录:
    接收后端返回的自定义令牌,调用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能正常读取配置:

  • 操作步骤:
    1. 部署轻量服务(如GCP Cloud Functions、Cloud Run或Nginx)
    2. 配置路由:当请求/你的代理路径/.well-known/openid-configuration时,转发到https://www.linkedin.com/oauth/.well-known/openid-configuration
    3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:52:27