使用JWT令牌+ Shibboleth SSO保护Node JS API

时间:2018-07-18 21:24:49

标签: node.js authentication jwt single-sign-on shibboleth

我的问题:如何使用具有Shibboleth SSO作为身份验证机制的JWT令牌保护Node JS API?

[我的申请流程]

  • 我有一个AngularJS应用程序和一个后端Node JS应用程序。
  • AngularJS应用通过通过HTTP公开的API与后端应用进行通信。
  • 现在,使用Shibboleth SSO可以实现AngularJS App中的身份验证,
  • 在Shibboleth SSO中,用户正在根据IDP进行身份验证,因此在登录机制期间我没有控制权。换句话说,IDP无法控制。
  • 通过身份验证后,Shibboleth将所需的有关用户的数据返回到AngularJS应用。
  • 然后AngularJS应用通过API与后端应用进行通信以获取一些数据。

[用于保护API的标准JWT场景]

  • 用户尝试从前端应用程序登录,该应用程序将通过发送用户名和密码在后端调用Login API。
  • 在后端,如果用户存在,则后端将生成JWT令牌并将其发送回用户。
  • 用户将利用该JWT令牌进行进一步的API调用。后端可以验证令牌并做出适当的响应。
  • 因此保护API的安全并防止未经授权的访问。

[我的JWT场景和问题]

  • 当用户到达前端AngularJS应用时,该用户将已经通过身份验证。
  • 现在AngularJS应用程序将向后端进行一些API调用以获取某些数据。
  • [问题/问题] :如何保护我的后端API免受未经授权的访问?

[一种有缺陷的方法]

  • [方法] :我可以在Node JS应用中创建一个Login API,该API将接受我从Shibboleth SSO收到的用户名和密码,并在后端生成一个JWT令牌。并使后端返回该JWT令牌作为响应。用户可以进一步利用它来进行API调用。
  • [缺陷]:但是这种方法的问题是:如何验证从前端收到的用户名和密码的合法性?

同样,我的问题是:如何使用具有Shibboleth SSO作为身份验证机制的JWT令牌保护Node JS API?


我希望,我可能已经正确解释了我的情况。任何帮助,指导或正确的方向将不胜感激。

谢谢:)

1 个答案:

答案 0 :(得分:1)

本文介绍了[NORMAL JWT安全场景API]策略:https://medium.com/front-end-weekly/learn-using-jwt-with-passport-authentication-9761539c4314

假设您使用Node Express之类的库来实现API资源终结点,则可以利用Passport之类的应用中间件来处理身份验证,并仅对拥有有效JWT令牌的客户端限制对资源的访问:

  • NodeJS后端应用程序基于用户名和密码以及生成和签名JWT令牌的逻辑,实现了本地Passport策略。
  • AngularJS应用程序在后端调用/login端点,并为其提供JWT令牌。
  • AngularJS应用程序在向受保护资源端点发出的任何后续请求中都包含JWT令牌。

此刻,我们介绍[MY JWT场景和问题]:当用户使用AngularJS应用时,他已经通过Shibboleth SSO进行了身份验证。并且您想通过允许AngularJS应用程序向NodeJS后端提供自己的用户名/密码来确保他不能脱离SSO上下文。

这需要一种可靠的方式来验证NodeJS后端中IdP提供给AngularJS应用的SAML2断言。根据{{​​3}}上可用的SAML描述,这要求在NodeJS后端和IDP之间建立信任关系,以便后端可以验证AngularJS应用提供的SAML断言。

为此,我从本文https://community.apigee.com/articles/33625/saml-20-vs-jwt-understanding-federated-identity-an.html启发了我的 理论答案 。它基本上扩展了上面已经讨论过的JWT令牌实现,如下所示:

  • 包括一种passport-saml策略,以便与Shibboleth SSO通信以进行SAML2断言验证,并将NodeJS后端作为SP注册到IdP(请参阅将SP元数据提供给IDP 上方链接中的“”部分。
  • 删除受本地策略保护的原始/login端点,因为我们不希望允许未经验证的用户名/密码登录。
  • 在NodeJS后端中创建一个/ssologin端点,并使用SAML策略通过Passport身份验证保护对路由的访问。 AngularJS应用程序将调用此终结点并传递SAML2断言作为尝试访问它的一部分。
  • /ssologin路由执行操作。仅当NodeJS应用已针对Shibboleth SSO(IdP)验证了SAML2断言时,才会调用此方法。现在,您可以使用SAML断言中的信息在后端生成JWT令牌,并将其返回到AngularJS应用。
  • 所有其他资源终结点均受JWT Passport策略保护。 AngularJS应用程序每次想要访问它们时都需要发送JWT令牌。

希望它有助于设计最终的解决方案。