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

6
我的问题是:如何使用Shibboleth SSO作为身份验证机制,使用JWT令牌保护我的Node JS API?
[我的应用程序流程]
- 我有一个AngularJS应用程序和一个后端Node JS应用程序。 - AngularJS应用程序通过HTTP公开的API与后端应用程序通信。 - 现在,AngularJS应用程序使用Shibboleth SSO实现身份验证,这很完美。 - 在Shibboleth SSO中,用户针对IDP进行身份验证,因此在登录机制期间我没有控制权。换句话说,IDP不在我的控制范围内。 - 一旦经过身份验证,Shibboleth将返回有关用户的所需数据给AngularJS应用程序。 - 然后,AngularJS应用程序通过API与后端应用程序通信以获取某些数据。
[NORMAL JWT SCENARIO TO SECURE API]
- 用户尝试从前端应用程序登录,该应用程序将通过发送用户名和密码调用后端的登录API。 - 如果用户存在于后端,则后端生成JWT令牌并将其发送回用户。 - 用户将利用该JWT令牌进行进一步的API调用。后端可以验证令牌并做出适当的响应。 - 因此,保护API并防止未经授权的访问。
[MY JWT SCENARIO AND PROBLEM]
- 当用户到达前端AngularJS应用程序时,用户已经通过身份验证。 - 现在,AngularJS应用程序将对后端进行一些数据的API调用。 - [问题/问题]:如何保护我的后端API免受未经授权的访问?
[AN APPROACH WITH A FLAW]
- [方法]:我可以在我的Node JS应用程序中创建一个登录API,该API将接受我从Shibboleth SSO收到的用户名和密码,并在后端生成JWT令牌。并使后端返回该JWT令牌作为响应。用户可以进一步利用它进行API调用。 - [缺陷]:但是这种方法的问题是:我如何验证我从前端收到的用户名和密码的合法性?
因此,我的问题再次是:如何使用Shibboleth SSO作为身份验证机制,使用JWT令牌保护我的Node JS API?希望能得到帮助、指导或正确的方向。谢谢 :)

你是如何在你的Web应用程序上设置Shibboleth SSO的?我正在努力尝试并已经在Google上搜索了很长时间。你需要访问哪个端点?有没有关于入门的好教程? - Ethan SK
@EthanSK 你正在尝试做什么?你能向我解释一下你的情境吗? - Ankit Prajapati
https://stackoverflow.com/questions/64762165/how-to-set-up-shibboleth-login-for-webapp-in-nodejs?noredirect=1#comment114584154_64762165 - Ethan SK
1个回答

2
[NORMAL JWT SCENARIO TO SECURE API] 策略在这篇文章中有详细解释:https://medium.com/front-end-weekly/learn-using-jwt-with-passport-authentication-9761539c4314。假设您使用像Node Express这样的库来实现API资源端点,您可以利用应用程序中间件(如Passport)处理身份验证并仅为持有有效JWT令牌的客户端限制对资源的访问。
  • NodeJS后端应用程序基于用户名和密码实现本地Passport策略,并生成和签署JWT令牌的逻辑。
  • AngularJS应用程序调用后端的/login端点,并提供JWT令牌。
  • AngularJS应用程序将JWT令牌包括在向受保护的资源端点发出的任何后续请求中。
此时我们介绍[MY JWT SCENARIO AND PROBLEM]:当用户到达AngularJS应用程序时,他已经通过Shibboleth SSO进行了身份验证。您希望确保他不能通过允许AngularJS应用程序向NodeJS后端提供自己的用户名/密码而走出SSO上下文。
这需要一种可信的方式来验证由IdP在NodeJS后端提供给AngularJS应用程序的SAML2断言。根据在https://community.apigee.com/articles/33625/saml-20-vs-jwt-understanding-federated-identity-an.html中提供的SAML描述,这需要在NodeJS后端和IDP之间建立信任,以便后端可以验证AngularJS应用程序提供的SAML断言。
为此,我从这篇文章中获得了灵感:https://wiki.library.ucsf.edu/spaces/flyingpdf/pdfpageexport.action?pageId=361762610。它基本上扩展了上面已经讨论过的JWT令牌实现。
  • 在NodeJS后端注册passport-saml策略,与Shibboleth SSO进行通信以进行SAML2断言验证,并将其作为SP注册到IdP中(请参见上面链接中的向IDP提供SP元数据部分)。
  • 删除原始的由本地策略保护的/login端点,因为我们不希望允许未经验证的用户名/密码登录。
  • 在NodeJS后端创建一个/ssologin端点,并使用SAML策略通过Passport身份验证来保护对该路由的访问。AngularJS应用程序将调用此端点,并在尝试访问它的过程中传递SAML2断言。
  • 实现/ssologin路由的操作。仅当NodeJS应用程序针对Shibboleth SSO(IdP)对SAML2断言进行了验证时,才会调用此操作。现在,您可以使用SAML断言中的信息在后端生成JWT令牌并将其返回给AngularJS应用程序。
  • 所有其他资源端点仍然受JWT Passport策略的保护。每次想要访问它们时,AngularJS应用程序都需要发送JWT令牌。

希望这可以帮助制定出最终的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接