如何为Microsoft Entra ID JWT添加aud声明适配FaunaDB
解决Microsoft Entra与FaunaDB的JWT受众匹配问题
核心限制说明
Microsoft Entra ID(原Azure AD)颁发的ID令牌和访问令牌的aud(受众)声明是受限字段:
- 不可追加多个值,只能是你的应用注册ID或已在Entra中注册的资源ID
- 强行替换
aud会导致令牌无法被Entra验证,进而被你的应用或第三方服务拒绝
你尝试的三种方法之所以无效,原因如下:
- 添加可选
aud声明:Entra不允许自定义aud值,仅支持预定义的注册资源/应用ID - 使用
audOverride:替换后的aud不是Entra认可的资源,会导致令牌无效;新增的audienceOverride字段也不符合Fauna对aud声明的要求 - 修改应用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
相关产品推荐
相关产品推荐

