0

我有一个 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 是正确的。它必须是代码中的其他内容,但我对什么感到困惑。有什么线索吗?

4

0 回答 0