React SPA经Azure AD外部标识用户流认证后,如何在NestJS后端实现API鉴权?
NestJS后端API权限控制(Azure AD用户流令牌验证)
一、核心思路
Azure AD用户流颁发的令牌是标准JWT,后端需通过验证JWT的签名、受众、发行者、过期时间来限制API访问,仅允许携带有效令牌的请求通过。
二、准备Azure配置信息
从Azure门户获取以下关键参数:
- 租户ID(Directory ID)
- 后端API在Azure AD中注册的客户端ID
- 后端API的应用ID URI(即暴露API时设置的标识符)
- 用户流对应的前端应用客户端ID(用于额外验证令牌来源,可选)
三、集成Passport Azure AD验证
使用passport-azure-ad库(专门适配Azure AD令牌验证),步骤如下:
- 安装依赖
npm install passport-azure-ad passport @nestjs/passport
- 创建Azure AD验证策略
新建azure-ad.strategy.ts文件:
import { Injectable } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; import { BearerStrategy } from 'passport-azure-ad'; @Injectable() export class AzureADStrategy extends PassportStrategy(BearerStrategy) { constructor() { super({ identityMetadata: `https://login.microsoftonline.com/{你的租户ID}/v2.0/.well-known/openid-configuration`, clientID: '{后端API的客户端ID}', validateIssuer: true, issuer: `https://login.microsoftonline.com/{你的租户ID}/v2.0/`, audience: '{后端API的应用ID URI}', loggingLevel: 'info', passReqToCallback: false, }); } async validate(payload: any) { // 可在此添加自定义验证逻辑,比如校验用户是否在本地数据库存在 return { userId: payload.sub, email: payload.email }; } }
- 注册验证模块
在AuthModule中集成策略和Passport:
import { Module } from '@nestjs/common'; import { PassportModule } from '@nestjs/passport'; import { AzureADStrategy } from './azure-ad.strategy'; @Module({ imports: [PassportModule], providers: [AzureADStrategy], exports: [PassportModule], }) export class AuthModule {}
四、保护API路由
在需要限制访问的控制器或路由上添加AuthGuard守卫:
import { Controller, Get, UseGuards } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; @Controller('protected') export class ProtectedController { @Get() @UseGuards(AuthGuard('bearer')) getProtectedData() { return { message: '仅携带有效Azure用户流令牌的请求可访问此接口' }; } }
五、前端请求注意事项
- 前端使用msal-react获取令牌时,需指定后端API的应用ID URI作为
scope,格式为{后端API的应用ID URI}/.default - 请求后端API时,需在请求头中携带
Authorization: Bearer {获取到的令牌}
六、关键验证说明
- 签名验证:
passport-azure-ad会自动从Azure的OpenID配置端点获取公钥,验证JWT签名有效性 - 受众验证:确保令牌的
aud字段与后端API的应用ID URI匹配,防止令牌滥用 - 发行者验证:校验令牌是否由你的Azure租户用户流颁发
- 过期验证:自动检查令牌的
exp字段,拒绝过期令牌
内容的提问来源于stack exchange,提问作者Samaha Hcndcl
相关产品推荐
相关产品推荐

