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

德国国家云中用户认证使用Graph API的Node.js应用适配问询

适配德国国家云的Passport-OAuth认证+Graph API调用方案

刚好之前帮客户做过类似的跨国家云适配,给你梳理下具体的落地步骤,都是实际踩过坑的经验,照着来就没问题:

1. 先搞懂德国国家云的核心差异

德国国家云(Microsoft Cloud Germany)是独立于全球版的云环境,核心的终结点和全球版完全不同,这是最关键的:

  • 授权/令牌终结点:https://login.microsoftonline.de/{tenant-id}(用common适配多租户场景)
  • Graph API根地址:https://graph.microsoft.de/v1.0/
  • 应用必须在德国Azure门户(https://portal.azure.de)注册,全球版的应用没法直接用在德国云

2. 德国云侧的应用注册调整

  • 登录https://portal.azure.de,注册一个新的应用(不建议迁移全球版应用,直接注册新的更稳妥)
  • 配置和现有应用一致的重定向URI,确保回调地址匹配
  • 申请权限时,把原来的https://graph.microsoft.com开头的权限,全部替换成https://graph.microsoft.de前缀,比如https://graph.microsoft.de/Mail.ReadWrite,权限范围和你原来列的完全对应就行,别忘了勾选offline_access来获取刷新令牌
  • 如果是需要管理员同意的权限(比如Mail、日历这类读写权限),要在德国门户里完成管理员同意操作

3. Passport-OAuth的代码改造

3.1 调整Strategy的核心配置

原来的全球版配置指向的是login.microsoftonline.com,现在要全部换成德国云的终结点。假设你用的是passport-oauth2或者基于它封装的策略,修改示例如下:

const passport = require('passport');
const OAuth2Strategy = require('passport-oauth2');

// 德国云专属终结点配置
const DE_AUTH_ENDPOINT = 'https://login.microsoftonline.de/common/oauth2/v2.0/authorize';
const DE_TOKEN_ENDPOINT = 'https://login.microsoftonline.de/common/oauth2/v2.0/token';
const DE_GRAPH_ROOT = 'https://graph.microsoft.de/v1.0/';

passport.use(new OAuth2Strategy({
    authorizationURL: DE_AUTH_ENDPOINT,
    tokenURL: DE_TOKEN_ENDPOINT,
    clientID: '你的德国云应用客户端ID',
    clientSecret: '你的德国云应用客户端密钥',
    callbackURL: '你的应用回调URI',
    // 替换权限前缀为德国云的Graph地址
    scope: [
        'openid', 
        'offline_access', 
        'email', 
        'profile', 
        'https://graph.microsoft.de/Mail.ReadWrite',
        'https://graph.microsoft.de/Mail.Send',
        'https://graph.microsoft.de/User.Read',
        'https://graph.microsoft.de/Contacts.ReadWrite',
        'https://graph.microsoft.de/Calendars.ReadWrite'
    ]
}, (accessToken, refreshToken, profile, done) => {
    // 这里保留你原来的用户逻辑就行,比如存数据库
    // 小提醒:profile的字段结构可能和全球版略有差异,测试时留意下
    return done(null, { profile, accessToken, refreshToken });
}));

3.2 替换所有Graph API调用地址

原来代码里所有调用https://graph.microsoft.com的地方,全部换成https://graph.microsoft.de/v1.0/。比如获取用户邮件的请求:

// 原来的全球版请求
// fetch('https://graph.microsoft.com/v1.0/me/messages')
// 现在改成德国云地址
fetch(`${DE_GRAPH_ROOT}me/messages`, {
    headers: {
        'Authorization': `Bearer ${accessToken}`
    }
})

3.3 刷新令牌的逻辑调整

刷新令牌时,也要用德国云的令牌终结点,请求参数和原来一致,只是地址换了:

async function refreshAccessToken(refreshToken) {
    const response = await fetch(DE_TOKEN_ENDPOINT, {
        method: 'POST',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        body: new URLSearchParams({
            client_id: '你的德国云客户端ID',
            client_secret: '你的德国云客户端密钥',
            grant_type: 'refresh_token',
            refresh_token: refreshToken,
            // 这里的scope要和授权时保持一致
            scope: 'openid offline_access https://graph.microsoft.de/Mail.ReadWrite ...'
        })
    });
    return response.json();
}

4. 测试必做的几件事

  • 必须用德国国家云中的Office 365用户测试,全球版用户没法在德国云完成认证
  • 检查权限是否正确生效,尤其是管理员同意的权限,要确认已经在德国门户完成同意
  • 调试时可以先用Postman测试德国云的终结点,确保能正常拿到令牌和调用Graph API,再集成到代码里

5. 多环境适配(可选)

如果你的应用需要同时支持全球版和德国云,可以加个环境变量开关来动态切换配置:

const useDeCloud = process.env.USE_GERMAN_CLOUD === 'true';
const authEndpoint = useDeCloud 
    ? 'https://login.microsoftonline.de/common/oauth2/v2.0/authorize' 
    : 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize';
const tokenEndpoint = useDeCloud
    ? 'https://login.microsoftonline.de/common/oauth2/v2.0/token'
    : 'https://login.microsoftonline.com/common/oauth2/v2.0/token';
const graphRoot = useDeCloud
    ? 'https://graph.microsoft.de/v1.0/'
    : 'https://graph.microsoft.com/v1.0/';

这样就能灵活切换不同云环境了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:06:25