Azure AD JWT ID Token验证方法及官方库缺失疑问咨询
Azure AD JWT ID Token 验证指南及常见问题解答
一、验证用的公钥获取方式
- Azure AD的公钥通过OpenID元数据端点获取,地址格式为:
https://login.microsoftonline.com/{tenant-id}/v2.0/.well-known/openid-configuration- 其中
{tenant-id}可替换为你的租户ID,或使用common(适配多租户应用) - 该端点返回的JSON数据中,
jwks_uri字段指向公钥集(JWKS格式)的地址,请求此地址即可拿到用于签名验证的公钥
- 其中
二、使用公钥验证ID Token的步骤
服务器端验证需完成以下核心流程:
- 解析ID Token的Header部分,提取
kid(密钥ID),用于匹配JWKS中对应的公钥 - 从JWKS中筛选出
kid匹配的公钥,转换为可用于验证的格式(如PEM) - 验证JWT的签名有效性
- 验证关键声明(必须完成,否则验证不完整):
iss(签发者)必须匹配Azure AD的签发地址(如https://login.microsoftonline.com/{tenant-id}/v2.0)aud(受众)必须与你的应用注册的Client ID一致exp(过期时间)需晚于当前时间,nbf(生效时间)需早于当前时间- 若客户端生成了
nonce,需验证该声明的一致性;按需验证iat等其他声明
三、关于微软官方令牌验证库的说明
微软并非没有官方验证库,只是不同语言生态下的呈现形式不同:
- .NET平台:使用
Microsoft.IdentityModel.Tokens和System.IdentityModel.Tokens.Jwt包,专门处理Azure AD的JWT验证 - Java平台:通过MSAL for Java(Microsoft Authentication Library)提供JWT验证工具
- Node.js:可使用
@azure/msal-node官方SDK,或结合jsonwebtoken与jwks-rsa工具完成验证
谷歌的官方库更多是针对自身生态做了更统一的封装,微软的验证能力则分散在各语言的官方SDK中,均由官方维护。
你的Angular客户端代码示例
export class AccountComponent implements OnInit { constructor(private tokenService: TokenStorageService, private readonly _authService: SocialAuthService) { } ngOnInit(): void { this._authService.authState.subscribe(this.externalAccountLogin); } signInWithMicrosoft(){ this._authService.signIn(MicrosoftLoginProvider.PROVIDER_ID); } externalAccountLogin(user: SocialUser): void{ switch(user.provider){ case MicrosoftLoginProvider.PROVIDER_ID: console.log(user.idToken); break; case GoogleLoginProvider.PROVIDER_ID: //ToDo break; } } }
内容的提问来源于stack exchange,提问作者Quttar
相关产品推荐
相关产品推荐

