javascript - 存储 MSAL 登录用户并在对 node.js Web 应用程序发出请求之前对其进行预检查
问题描述
在我的节点项目中,我有以下基本代码通过令牌连接到 Azure。登录/注销与我们的 Azure 配合使用非常好:
const express = require("express");
const msal = require('@azure/msal-node');
const SERVER_PORT = process.env.PORT || 3000;
const config = {
auth: {
clientId: "XXX",
authority: "https://login.microsoftonline.com/common",
clientSecret: "XXX"
},
system: {
loggerOptions: {
loggerCallback(loglevel, message, containsPii) {
console.log(message);
},
piiLoggingEnabled: false,
logLevel: msal.LogLevel.Verbose,
}
}
};
const pca = new msal.ConfidentialClientApplication(config);
const app = express();
app.get('/', (req, res) => {
res.send("<a href=\"login\">Login</a> <a href=\"logout\">Logout</a>");
});
app.get('/dashboard', (req, res) => {
// check here for valid token...
});
app.get('/login', (req, res) => {
const authCodeUrlParameters = {
scopes: ["user.read"],
redirectUri: "http://localhost:3000/redirect",
};
pca.getAuthCodeUrl(authCodeUrlParameters).then((response) => {
res.redirect(response);
}).catch((error) => console.log(JSON.stringify(error)));
});
app.get('/logout', (req, res) => {
res.redirect('https://login.microsoftonline.com/common/oauth2/v2.0/logout?post_logout_redirect_uri=http://localhost:3000/');
});
app.get('/redirect', (req, res) => {
const tokenRequest = {
code: req.query.code,
scopes: ["user.read"],
redirectUri: "http://localhost:3000/redirect",
};
pca.acquireTokenByCode(tokenRequest).then((response) => {
console.log("\nResponse: \n:", response);
res.sendStatus(200);
}).catch((error) => {
console.log(error);
res.status(500).send(error);
});
});
app.listen(SERVER_PORT, () => console.log(`Msal Node Auth Code Sample app listening on port ${SERVER_PORT}!`))
但是,如果令牌仍然有效,如何在登录后正确检查?
所以问题是,如何保存 /dashboard 上的用户仍然具有有效令牌或已登录?
app.get('/dashboard', (req, res) => {
// check here for valid token...
});
最后,我需要一个 node.js 应用程序:
- 是安全的(基于令牌)
- 具有用户身份验证 (msal)
- 可以对路由给予细粒度的权限
我可以在 node.js 中做所有这些,还是在客户端更好地做这些?但是我是否会降低安全性?
解决方案
第一次获得身份验证结果后,如果身份验证成功,它应该已收到令牌。您应该能够解析 Id 令牌以获取有关用户的信息。然后,您可以使用该信息通过您正在使用的 Web 框架创建会话。该会话可以在整个 Web 应用程序中使用,以向您提供信息,例如用户是否经过身份验证、他们经过身份验证的时间以及他们有权访问的内容。通常 web 框架会创建一个带有 session id 的 cookie,这样进来的请求就可以有 session 信息,并且用户不必每次都进行身份验证。
如果会话过期,您可以尝试使用作为 MSAL 一部分的令牌缓存以静默方式(不提示用户)获取令牌。当您调用获取令牌静默时,MSAL 将自动检查访问令牌是否有效,如果不是,它将尝试通过刷新令牌刷新访问令牌。如果两者都不有效,它们将返回错误。此时,您可以回退到再次提示用户进行身份验证(通过您已经共享的代码)。
推荐阅读
- javascript - 在 gatsby 上调用 rest 的实现
- firefox - 由于 Firefox 浏览器中的安全限制,Neo4j 驱动程序无法连接到服务器
- office365 - 基本身份验证客户端报告 - Office 365 控制台中有一个吗?
- ios - 从 App Store 下载的应用程序有 BadDeviceToken,从源代码构建没有
- java - 有没有办法在不创建 POJO 的情况下使用 jackson API 解析其标签元素中具有属性的嵌套 XML?
- vue.js - 将全局 css 导入 VueJs 不会将 css 加载到应用程序包
- sql - Oracle:如何使用 sql 使用前一行的值填充行之间的空白
- javascript - 有没有办法为 Typescript 中的嵌套键访问创建类型保护?
- json - 如何从 Flutter 中的 JSON 文件中获取所有命令 ID?
- rust - 在不违反 Rust 借用规则的情况下,使用其值作为索引来更改向量