【问题标题】:Securing Node JS API with JWT Token + Shibboleth SSO使用 JWT 令牌 + Shibboleth SSO 保护节点 JS API
【发布时间】:2018-12-26 21:58:58
【问题描述】:

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

[我的申请流程]

  • 我有一个 AngularJS 应用程序和一个后端节点 JS 应用程序。
  • AngularJS 应用通过 HTTP 公开的 API 与后端应用通信。
  • 现在 AngularJS 应用程序中的身份验证是使用 Shibboleth SSO 实现的,运行良好。
  • 在 Shibboleth SSO 中,用户通过 IDP 进行身份验证,因此在登录机制期间我没有控制权。换句话说,IDP 不在我的控制范围内。
  • 通过身份验证后,Shibboleth 将有关用户的所需数据返回给 AngularJS 应用程序。
  • 然后 AngularJS App 通过 API 与 Back-End App 通信以获取一些数据。

[保护 API 的普通 JWT 场景]

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

[我的 JWT 场景和问题]

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

[有缺陷的方法]

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

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


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

谢谢:)

【问题讨论】:

  • 您是如何设法在您的 web 应用上设置 shibboleth SSO 的?我正在努力奋斗,并且已经在谷歌上搜索了很长时间。您需要达到哪个端点?有什么好的入门教程吗?
  • @EthanSK 你想做什么?你能向我解释一下你的情况吗?

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


【解决方案1】:

本文解释了 [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 上下文。

这需要一种可信的方式来验证 NodeJS 后端中的 IdP 提供给 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-token 实现,如下所示:

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

希望它有助于设计一个明确的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-02
    • 2019-12-15
    • 2017-05-13
    • 2020-11-09
    • 2018-09-12
    • 1970-01-01
    • 2014-06-30
    • 2019-12-25
    相关资源
    最近更新 更多