如何从 AAD 验证 ID 令牌,然后调用用户信息

How to verify ID token from AAD, and then call user info

我正在尝试从 Azure Active Directory 登录,并在 return 中获取令牌。我现在如何验证所述令牌并登录? 我也在尝试获取 access_token 并获取用户信息,但是在向 response_type.

添加令牌时出现错误

我的客户端代码是:

export function AzureLogin(){
  useEffect(async  () => {
    const { authorization_endpoint } = await fetchJSON(
        "https://login.microsoftonline.com/consumers/v2.0/.well-known/openid-configuration"
    );

    const parameters = {
      client_id: "my client id",
      response_type: "id_token (id_token%20token when trying to get access_token)",
      scope: "openid",
      nonce: "123",
      redirect_uri: window.location.origin + "/login/azure/callback"
    }

    window.location.href =
        authorization_endpoint + "?" + new URLSearchParams(parameters)
  }, [])
}

export function AzureCallback(){
  useEffect(async () => {
    const { id_token } = Object.fromEntries(
        new URLSearchParams(window.location.hash.substring(1))
    );

    await fetch("/api/login/azure", {
      method: "POST",
      headers: {
        "content-type": "application/json",
      },
      body: JSON.stringify({ id_token }),
    })
  })
}

我的服务器代码是:

router.post("/azure", async (req, res) => {
        const { id_token } = req.body;

        res.cookie("id_token", id_token, {signed: true, maxAge: 2 * 60 * 60 * 1000});

          const {userinfo_endpoint} = await fetchJSON(
              "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration"
          );

          const userinfo = await fetchJSON(userinfo_endpoint, {
              headers: {
                  Authorization: `Bearer ${id_token}`,
              },
          })

      console.log(userinfo)

          const name = userinfo.name;
          const id = userinfo.sub;
          const email = userinfo.email;
          const picture = userinfo.picture;

          db stuff

        res.sendStatus(200);
      })

在您的评论中回答您的问题。

ID-token 的目的是告诉客户端有关用户如何进行身份验证的详细信息。它通常仅用于在客户端创建本地“会话”,然后被丢弃。

ID-token 的生命周期通常很短(在某些设置中为 5 分钟),不应将其发送到外部 services/APIs。

客户端不应该查看 access-token 内部,甚至不需要验证它。 API 的工作是稍后接收令牌以根据 AzureAD 中的 public 签名密钥验证 access-token 的签名。