如何使用 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);
});
我使用 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);
});