如何从 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 的签名。
我正在尝试从 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 的签名。