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

多租户MS Teams Bot(NodeJS)认证及无UI消息推送方案咨询

在MS Teams中实现无UI多租户通知Bot的授权与令牌持久化方案

针对你需要的管理员代表全员授权、持久化令牌、无UI后台发送通知的需求,MS Teams中可以通过Azure AD的**应用权限(Application Permissions)**实现,对应Slack的Bot令牌模式,具体步骤如下:

1. 注册多租户Azure AD应用

Teams Bot的身份验证依赖Azure AD,首先完成应用注册:

  • 在Azure门户注册一个多租户应用程序,设置重定向URI为你的后端服务地址(比如https://your-backend.com/teams-auth-callback,用于接收授权回调)
  • 切换到「API权限」页面,添加Microsoft Graph的应用权限:
    • 发送消息需要ChatMessage.Send(允许应用发送聊天消息)
    • 获取用户信息需要User.Read.All(允许应用读取企业内所有用户的基本信息)
    • 所有添加的应用权限都需标记为「需要管理员同意」

2. 实现管理员授权流程

让外部企业管理员完成一次性授权,获取可持久化的刷新令牌:

  • 构造管理员同意URL,核心参数包括:
    • client_id:你的Azure AD应用ID
    • response_type=code
    • redirect_uri:之前设置的后端回调地址
    • scope=https://graph.microsoft.com/.default(表示申请应用权限中配置的所有范围)
    • prompt=admin_consent(强制触发管理员同意流程)
  • 引导企业管理员访问该URL,完成授权后,后端会收到授权码
  • 用授权码调用Azure AD的令牌端点,交换获取应用访问令牌和刷新令牌:
    const axios = require('axios');
    
    async function getTokens(authCode) {
      const response = await axios.post('https://login.microsoftonline.com/common/oauth2/v2.0/token', {
        client_id: 'YOUR_APP_ID',
        client_secret: 'YOUR_APP_SECRET',
        code: authCode,
        redirect_uri: 'YOUR_REDIRECT_URI',
        grant_type: 'authorization_code',
        scope: 'https://graph.microsoft.com/.default'
      });
      return {
        accessToken: response.data.access_token,
        refreshToken: response.data.refresh_token,
        expiresIn: response.data.expires_in
      };
    }
    

3. 令牌持久化与自动刷新

  • 将获取到的刷新令牌安全存储(比如加密后存入数据库、密钥管理服务),访问令牌有效期短(约1小时)无需持久化
  • 每次发送通知前,检查本地缓存的访问令牌是否过期,过期则用刷新令牌获取新的访问令牌:
    async function refreshAccessToken(refreshToken) {
      const response = await axios.post('https://login.microsoftonline.com/common/oauth2/v2.0/token', {
        client_id: 'YOUR_APP_ID',
        client_secret: 'YOUR_APP_SECRET',
        refresh_token: refreshToken,
        grant_type: 'refresh_token',
        scope: 'https://graph.microsoft.com/.default'
      });
      return {
        newAccessToken: response.data.access_token,
        newRefreshToken: response.data.refresh_token // 部分情况会返回新的刷新令牌,需更新存储
      };
    }
    

4. 后台发送通知(无UI)

使用Microsoft Graph SDK for Node.js,用应用令牌调用API发送消息:

  • 安装SDK:npm install @microsoft/microsoft-graph-client @azure/msal-node
  • 初始化Graph客户端并发送消息:
    const { Client } = require('@microsoft/microsoft-graph-client');
    const { TokenCredentialAuthenticationProvider } = require('@microsoft/microsoft-graph-client/authProviders/azureTokenCredentials');
    const { ClientSecretCredential } = require('@azure/msal-node');
    
    async function sendNotification(userId, messageContent, accessToken) {
      // 用应用令牌初始化客户端
      const credential = new ClientSecretCredential(
        'common', // 多租户用common
        'YOUR_APP_ID',
        'YOUR_APP_SECRET'
      );
      const authProvider = new TokenCredentialAuthenticationProvider(credential, {
        scopes: ['https://graph.microsoft.com/.default']
      });
      const client = Client.initWithMiddleware({ authProvider });
    
      // 发送消息到用户的一对一聊天
      await client.api(`/users/${userId}/chatMessages`)
        .post({
          body: {
            content: messageContent
          }
        });
    }
    

关键注意事项

  • 多租户配置:确保Azure AD应用设置为「账户在任何组织目录中的用户」,允许外部企业管理员授权
  • 权限最小化:只申请必要的权限,避免过度授权引发安全风险
  • 令牌安全:刷新令牌是长期有效凭证,必须加密存储,禁止明文传输或存储
  • 无UI适配:整个流程只有管理员的一次授权操作,后续Bot完全后台运行,无需用户登录交互

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:52:39