无用户场景下调用Microsoft Graph API获取Bearer Token时遭遇404错误的求助
解决Microsoft Graph服务主体Token请求404的问题
我之前踩过一模一样的坑,先帮你把最直接的错误修正,再梳理其他需要检查的关键节点:
1. 导致404的核心原因:请求URL错误
你写的请求URL里多了HTTP/1.1,这是HTTP协议标识,不该出现在请求地址里,直接导致服务器找不到对应的资源。正确的Token端点URL应该是:https://login.microsoftonline.com/{租户ID}/oauth2/v2.0/token
2. 第二个关键错误:请求体格式不符合要求
客户端凭证模式的Token请求必须用application/x-www-form-urlencoded格式,而不是JSON格式。你用JSON.stringify把请求体转成JSON,服务器会解析失败,哪怕URL修复了也拿不到Token。
修正后的完整可运行代码
const fetch = require('node-fetch'); // 替换成你的真实信息 const tenantId = "f8cdef31-a31e-4b4a-93e4-5f571e91255a"; const clientId = "你的CLIENT_ID"; const clientSecret = "你的CLIENT_SECRET"; const tokenUrl = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`; // 用URLSearchParams处理表单格式的请求体,自动适配要求的编码 const body = new URLSearchParams({ client_id: clientId, scope: "https://graph.microsoft.com/.default", client_secret: clientSecret, grant_type: "client_credentials" }); fetch(tokenUrl, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" // 必须指定这个请求头 }, body: body }) .then(response => response.json()) // 记得解析响应为JSON,不然只能拿到原始响应对象 .then(data => { if (data.access_token) { console.log("获取Token成功:", data.access_token); // 接下来可以用这个Token调用创建Teams会议的Graph API接口 } else { console.log("获取Token失败:", data.error, data.error_description); } }) .catch(err => console.error("请求出错:", err));
额外需要核对的配置项
- 应用权限配置:你的Azure应用注册必须添加Microsoft Graph的应用权限(不是委托权限),比如
OnlineMeetings.ReadWrite.All,并且必须由管理员点击「授予管理员同意」,不然哪怕拿到Token,调用创建会议接口时会返回权限不足的错误。 - 凭证正确性:再核对一遍租户ID、客户端ID、客户端密钥,有没有复制多空格或者漏字符,尤其是客户端密钥,生成后只能查看一次,要是丢失就得重新生成。
- node-fetch版本兼容:如果使用node-fetch v3版本,需要用
import fetch from 'node-fetch',或者在package.json里添加"type": "module",否则会报错;v2版本直接用require即可。
内容的提问来源于stack exchange,提问作者retlok
相关产品推荐
相关产品推荐

