如何使用Azure AD授权Node.js API?

时间:2016-04-11 20:21:59

标签: angularjs node.js azure mean-stack azure-active-directory

我们有使用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模块?任何一个例子都会很有用。

4 个答案:

答案 0 :(得分:3)

我最近在我的带有nodejs后端和passport-azure-ad

的react应用程序中实现了一个

您可以在此处参阅我的信息以获取授权和身份验证 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.jsadal-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