如何使用 adal-node 身份验证上下文验证访问令牌?

How to verify a access token using adal-node authentication context?

我使用 adal-node 身份验证上下文和 angularjs 应用程序创建了一个 azure web api,jwt 令牌(访问令牌)已按顺序通过 angularjs 应用程序调用网络 API。在允许用户访问网络之前,我需要通过 jwt 令牌验证用户 API。如何使用 adal-node 身份验证上下文执行此 jwt 验证。

生成访问令牌的示例代码

function getToken(TENANT) {
    var promise = new Promise(function (resolve, reject) {
        try {
            //const authContext = new adal.AuthenticationContext(`https://login.microsoftonline.com/${TENANT}`);
            const authContext = new adal.AuthenticationContext('https://login.microsoftonline.com/'+TENANT);
            authContext.acquireTokenWithClientCredentials(GRAPH_URL,CLIENT_ID,CLIENT_SECRET,function(err,tokenRes)
            {
                if (err)
                {
                    reject(err);
                }
                var accesstoken = tokenRes.accessToken;
                resolve(accesstoken);
            })
        }
        catch (ex) {
            reject(ex);
        };
    });
    return promise;
}

实际上,根据adal-node的文档:

The ADAL for node.js library makes it easy for node.js applications to authenticate to AAD in order to access AAD protected web resources. It supports 3 authentication modes shown in the quickstart code below.

所以,总而言之,adal-node不具备验证JWT作为IDP服务器的功能

但是,如果您想阻止没有权限的人访问您的网站 api。您可以轻松利用 Azure 应用服务的 身份验证和授权 功能。您可以使用 AAD 来保护您的 Web API,并且针对此 Web API 的所有请求都需要在其 Authorization header.[= 中设置来自 AAD 的访问令牌15=]

您可以参考Authentication and authorization for API Apps in Azure App Service了解更多信息。

同时,如果您打算自己验证 JWT,则可以利用一些第 3 方模块,例如https://github.com/auth0/node-jsonwebtoken#jwtverifytoken-secretorpublickey-options-callback

您可以在 nodejs 中使用 passport 和 passport-azure-ad 验证 ADAL 令牌。它从请求 header 中获取 adal 令牌并对其进行验证。 这是示例代码。

const express = require("express");
const passport = require("passport");
const BearerStrategy = require("passport-azure-ad").BearerStrategy;

const options = {
  identityMetadata:
    "https://login.microsoftonline.com/<tenantidguid>/v2.0/.well-known/openid-configuration",
  clientID: "<clientidguid>",
  issuer: "https://sts.windows.net/<tenantidguid>/",
  loggingLevel: "info",
  passReqToCallback: false
};
const authenticationStrategy = new BearerStrategy(options, (token, done) => {
  return done(null, {}, token);
});

const app = express();
app.use(require("body-parser").urlencoded({ extended: true }));
app.use(passport.initialize());
passport.use(authenticationStrategy);

app.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*");
  res.header(
    "Access-Control-Allow-Headers",
    "Authorization, Origin, X-Requested-With, Content-Type, Accept"
  );
  next();
});

app.get(
  "/secured-api",
  passport.authenticate("oauth-bearer", { session: false }),
  (req, res) => {
    return res.status(200).json({ message: "token is verified" });
  }
);

const port = process.env.PORT || 3000;
app.listen(port, function() {
  console.log("Listening on port " + port);
});