我使用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;
}
答案 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);
});