首页 > 解决方案 > 存储 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 应用程序:

我可以在 node.js 中做所有这些,还是在客户端更好地做这些?但是我是否会降低安全性?

标签: javascriptnode.jsmsal

解决方案


第一次获得身份验证结果后,如果身份验证成功,它应该已收到令牌。您应该能够解析 Id 令牌以获取有关用户的信息。然后,您可以使用该信息通过您正在使用的 Web 框架创建会话。该会话可以在整个 Web 应用程序中使用,以向您提供信息,例如用户是否经过身份验证、他们经过身份验证的时间以及他们有权访问的内容。通常 web 框架会创建一个带有 session id 的 cookie,这样进来的请求就可以有 session 信息,并且用户不必每次都进行身份验证。

如果会话过期,您可以尝试使用作为 MSAL 一部分的令牌缓存以静默方式(不提示用户)获取令牌。当您调用获取令牌静默时,MSAL 将自动检查访问令牌是否有效,如果不是,它将尝试通过刷新令牌刷新访问令牌。如果两者都不有效,它们将返回错误。此时,您可以回退到再次提示用户进行身份验证(通过您已经共享的代码)。


推荐阅读