我有一个 Azure 计时器触发函数,它需要对 Graph API 进行各种调用,这意味着我需要一个由我的租户的 AAD 颁发的 OAuth2 Bearer 令牌。
所以我编写了下面的函数,它基于我之前编写的用于进行 Ajax 调用的代码,它调用 AAD 以获取我需要的 Bearer 令牌。
我已经使用 Postman 测试了 URL、客户端 ID、客户端密码和授予类型设置,它们返回了一个有效的承载令牌供我使用。但是代码进行了调用,并没有返回任何内容,它似乎只是挂起。在 Azure 门户中测试运行时,我得到一个
状态 503 服务不可用。
async function getToken() {
return new Promise((resolve, reject) => {
try {
let https = require("https");
let url =
"https://login.microsoftonline.com/<azure_tenancy>.onmicrosoft.com/oauth2/token";
let options = {
method: "POST",
headers: {
"Content-Type": "application/json; charset=utf-8",
"Cache-Control": "no-cache"
}
};
let body = {
grant_type: "client_credentials",
client_id: "<client_id>",
client_secret: "client_secret>",
resource: "https://graph.microsoft.com"
};
var req = https
.request(url, options, res => {
let data = "";
res.on("data", chunk => {
data += chunk;
});
res.on("end", () => {
resolve(JSON.parse(data));
});
})
.on("error", err => {
throw new Exception(e.message);
});
req.write(JSON.stringify(body));
req.end();
} catch (e) {
context.log("error caught");
reject(e);
}
});
}
邮递员返回:
{
"token_type": "Bearer",
"expires_in": "3600",
"ext_expires_in": "3600",
"expires_on": "1558542984",
"not_before": "1558539084",
"resource": "https://graph.microsoft.com",
"access_token": "eyJ...e8mw"
}
所以我知道我传递的 URL、ID 和 Secret 是正确的。它必须是代码中的其他内容,但我对什么感到困惑。有什么线索吗?