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

时间:2017-01-30 08:26:22

标签: node.js azure adal

我使用adal-node身份验证上下文和angularjs应用程序创建了一个azure web api,jwt令牌(访问令牌)已经通过angularjs应用程序以调用Web API。在允许用户访问Web API之前,我需要从jwt令牌验证用户。如何使用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;
}

2 个答案:

答案 0 :(得分:1)

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

  

node.js库的ADAL使node.js应用程序可以轻松地向AAD进行身份验证,以便访问受AAD保护的Web资源。它支持以下快速入门代码中显示的3种身份验证模式。

总而言之,adal-node没有将JWT验证为IDP服务器的功能。

但是,如果您想阻止人们访问您没有权限的网络API。您可以轻松利用Azure App Service的身份验证和授权功能。您可以使用AAD来保护Web API,并且针对此Web API的所有请求都需要在Authorization标头中设置来自AAD的访问令牌。

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

同时,如果您要自己验证JWT,可以使用某些第三方模块,例如: https://github.com/auth0/node-jsonwebtoken#jwtverifytoken-secretorpublickey-options-callback

答案 1 :(得分:0)

您可以使用nodejs中的passport和passport-azure-ad来验证ADAL令牌。它从请求标头中获取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);
});