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

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令牌验证),步骤如下:

  1. 安装依赖
npm install passport-azure-ad passport @nestjs/passport
  1. 创建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 };
  }
}
  1. 注册验证模块
    在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:58:17