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

如何为Microsoft Entra ID JWT添加aud声明适配FaunaDB

解决Microsoft Entra与FaunaDB的JWT受众匹配问题

核心限制说明

Microsoft Entra ID(原Azure AD)颁发的ID令牌和访问令牌的aud(受众)声明是受限字段:

  • 不可追加多个值,只能是你的应用注册ID或已在Entra中注册的资源ID
  • 强行替换aud会导致令牌无法被Entra验证,进而被你的应用或第三方服务拒绝

你尝试的三种方法之所以无效,原因如下:

  1. 添加可选aud声明:Entra不允许自定义aud值,仅支持预定义的注册资源/应用ID
  2. 使用audOverride:替换后的aud不是Entra认可的资源,会导致令牌无效;新增的audienceOverride字段也不符合Fauna对aud声明的要求
  3. 修改应用URI ID:Entra要求应用URI必须使用租户已验证的域名,无法设置为Fauna的外部URL

可行解决方案

不要试图修改Entra原生颁发的JWT,而是基于Entra令牌生成符合Fauna要求的新JWT,步骤如下:

1. 生成Fauna专用JWT

在你的GatsbyJS应用中,获取到Entra的有效令牌后,使用Fauna提供的密钥签发新JWT,确保包含Fauna要求的声明:

  • aud:设置为你的Fauna数据库URL(如https://db.fauna.com/db/xxxx)
  • sub:使用Entra令牌中的用户唯一标识(oid或sub字段)
  • 其他必要声明(如iat、exp)

示例代码(使用jsonwebtoken库):

import jwt from 'jsonwebtoken';
import { useMsal } from '@azure/msal-react';

const getFaunaAuthToken = async () => {
  const { instance } = useMsal();
  const activeAccount = instance.getActiveAccount();
  
  if (!activeAccount) return null;

  // 静默获取Entra ID令牌
  const tokenResponse = await instance.acquireTokenSilent({
    account: activeAccount,
    scopes: ['openid', 'profile']
  });

  const decodedEntraToken = jwt.decode(tokenResponse.idToken);

  // 签发符合Fauna要求的JWT
  return jwt.sign(
    {
      aud: 'https://db.fauna.com/db/your-fauna-db-id',
      sub: decodedEntraToken.oid,
      iat: Math.floor(Date.now() / 1000),
      exp: Math.floor(Date.now() / 1000) + 3600 // 有效期1小时
    },
    'your-fauna-server-secret', // 从Fauna控制台生成的密钥
    { algorithm: 'HS256' }
  );
};

2. 安全优化建议

纯前端直接使用Fauna密钥存在泄露风险,建议:

  • 搭建一个轻量后端API,前端将Entra令牌传给后端
  • 后端先验证Entra令牌的有效性(签名、过期时间、aud匹配你的应用ID)
  • 验证通过后,后端使用Fauna密钥生成JWT返回给前端使用

验证方法

生成JWT后,可通过Fauna的验证工具或JWT解码工具检查aud声明是否符合要求,确保能正常通过Fauna的身份验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:25:14