我们有使用MEAN堆栈编写的应用程序。目前,应用程序正在使用本地身份验证。我们正在尝试使用Azure AD身份验证替换它。
有一篇很好的文章here,展示了如何使用ADAL.JS库为Azure身份验证配置Angular。这将保护客户端资源。在示例中,服务器端API使用.Net Web API编写,OWIN用于保护Web API。因此,OWIN负责验证来自客户端的Bearer令牌发送。
使用MEAN堆栈,服务器端API是用Node.js编写的,那么如果我们切换到Azure AD,我们如何保护Node.js API呢? Microsoft是否提供任何Node模块?任何一个例子都会很有用。
答案 0 :(得分:3)
我最近在我的带有nodejs后端和passport-azure-ad
您可以在此处参阅我的信息以获取授权和身份验证 https://stackoverflow.com/a/58761942/8238968
您可以在https://github.com/AzureADQuickStarts/AppModelv2-WebAPI-nodejs/blob/master/node-server/config.js
中找到 BearerStrategyOptions 的键值仅供参考,我将以下公共端点'https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration用于 identityMetadata
const BearerStrategyOptions = {
identityMetadata,
clientID,
validateIssuer,
issuer,
passReqToCallback,
allowMultiAudiencesInToken,
audience
};
passport.use(
new BearerStrategy(BearerStrategyOptions, function(token, done) {
console.log("verifying the user");
console.log(token, "was the token retreived");
findByOid(token.oid, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
// "Auto-registration"
console.log(
"User was added automatically as they were new. Their oid is: ",
token.oid
);
users.push(token);
owner = token.oid;
return done(null, token);
}
owner = token.oid;
return done(null, user, token);
});
})
);
要授权路线,请在您的api中使用以下代码
passport.authenticate('oauth-bearer', {session: false})
完成!希望这会有所帮助:)
答案 1 :(得分:2)
Microsoft提供了passport插件passport-azure-ad。
passport-azure-ad 是Passport Strategies的集合,可帮助您与Azure Active Directory集成。它包括OpenID Connect,WS-Federation和SAML-P身份验证和授权。这些提供程序允许您将Node应用程序与Microsoft Azure AD集成,以便您可以使用其许多功能,包括Web单点登录(WebSSO),Endpoint Protection with OAuth以及JWT令牌颁发和验证。
答案 2 :(得分:0)
This article在角度脚本中配置AAD租户信息,这些信息会从客户端公开这些信息,这会增加泄露敏感信息的风险。
您可以考虑在Node.js应用程序中存储所有信息并在后端运行身份验证和授权流程。并且只为前端角客户端公开Apis。
您可以参考O365在gitHub提供的使用ADAL模块的示例。 主要的身份验证和授权流程是在https://github.com/OfficeDev/O365-Nodejs-Microsoft-Graph-Connect/blob/master/authHelper.js写的。
在Node.js中的请求中使用访问令牌可以参考https://github.com/OfficeDev/O365-Nodejs-Microsoft-Graph-Connect/blob/master/requestUtil.js
我发现ADAL.js是通过响应类型id_token遵循oauth2身份验证而设计的。这意味着它只会暴露tenantId和AAD应用程序clientId,这些不是那么敏感的信息。并且ADAL.js将在html5 sesstionStorage中存储access_token和几个用户信息。您可以参考http://www.cloudidentity.com/blog/2015/02/19/introducing-adal-js-v1/和http://www.cloudidentity.com/blog/2014/10/28/adal-javascript-and-angularjs-deep-dive/了解详情。
关于ADAL.js用法,您可以使用自己的逻辑在后端应用程序中通过JWT解析访问令牌,您可以参考https://github.com/matvelloso/AADNodeJWT处的示例。
同时,在我看来,您可以将MEAN应用程序分成2个独立的Azure Web应用程序。一个用于构建Angular App作为前端,另一个用于托管Expressjs Node.js App作为我们整个Web应用程序架构的后端。
在后端Web App服务中,您可以使用Azure Active Directory作为身份验证提供程序来保护Web Apis。有关详细信息,请参阅https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-how-to-configure-active-directory-authentication/。
在前端Web App服务中,您可以在Angular应用中使用adal.js
和adal-angular.js
进行身份验证和授权。您可以参考https://github.com/matvelloso/AADNodeJWT的前端部分。
成功完成身份验证流程后,adal.js
插件会将idtoken
存储在html5 sesstionstorage
中,因此我们可以利用此令牌请求受AAD保护的后端应用:
var token = sessionStorage.getItem('adal.idtoken');
$http.defaults.headers.common.Authorization= 'Bearer '+token;
$http.get('https://<your_backend_apis>').then(function (data){
console.log(data);
})
答案 3 :(得分:0)
要使用Azure AD授权Node.js服务器,您可以使用node.js中的 adal-node 库。
以下示例将逐步演示Azure AD的身份验证Node.js:
https://code.msdn.microsoft.com/How-to-authorize-Nodejs-fdc580ed