node.js - 使用 JWT 令牌 + Shibboleth SSO 保护节点 JS API
问题描述
我的问题:如何使用具有 Shibboleth SSO 作为身份验证机制的 JWT 令牌来保护我的 Node JS API?
[我的申请流程]
- 我有一个 AngularJS 应用程序和一个后端节点 JS 应用程序。
- AngularJS 应用程序通过通过 HTTP 公开的 API 与后端应用程序通信。
- 现在 AngularJS 应用程序中的身份验证是使用 Shibboleth SSO 实现的,它工作得非常好。
- 在 Shibboleth SSO 中,用户正在针对 IDP 进行身份验证,因此在登录机制期间我没有控制权。换句话说,IDP 是我无法控制的。
- 一旦通过身份验证,Shibboleth 会将有关用户的所需数据返回给 AngularJS 应用程序。
- 然后 AngularJS 应用程序通过 API 与后端应用程序通信以获取一些数据。
[保护 API 的普通 JWT 场景]
- 用户尝试从前端应用程序登录,该应用程序将通过发送用户名和密码在后端调用登录 API。
- 在 Back-End,如果 User 存在,Back-End 会生成一个 JWT Token 并发回给 User。
- 用户将利用该 JWT 令牌进行进一步的 API 调用。并且后端可以验证令牌并做出适当的响应。
- 因此保护 API 并防止未经授权的访问。
[我的 JWT 场景和问题]
- 当用户到达前端 AngularJS 应用程序时,用户已经通过了身份验证。
- 现在 AngularJS 应用程序将对后端进行一些 API 调用以获取一些数据。
- [问题/问题]:如何保护我的后端 API 免受未经授权的访问?
[有缺陷的方法]
- [方法]:我可以在我的 Node JS 应用程序中创建一个登录 API,它将接受我从 Shibboleth SSO 收到的用户名和密码,并在后端生成一个 JWT 令牌。并使后端将该 JWT 令牌作为响应返回。用户可以进一步利用它来进行 API 调用。
- [缺陷]:但是这种方法的问题是:如何验证我从前端收到的用户名和密码的合法性?
所以我的问题是:如何使用具有 Shibboleth SSO 作为身份验证机制的 JWT 令牌来保护我的 Node JS API?
我希望,我可能已经正确地解释了我的情况。任何帮助、指导或正确的方向将不胜感激。
谢谢 :)
解决方案
本文解释了 [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
端点,因为我们不希望允许未经验证的用户名/密码登录。 /ssologin
在 NodeJS 后端创建一个端点,并使用 SAML 策略通过 Passport 身份验证保护对路由的访问。AngularJS 应用程序将调用此端点并传递 SAML2 断言作为尝试访问它的一部分。- 实现
/ssologin
路由的动作。仅当 NodeJS 应用已针对 Shibboleth SSO (IdP) 验证了 SAML2 断言时,才会调用此方法。您现在可以使用来自 SAML 断言的信息在后端生成 JWT 令牌并将其返回给 AngularJS 应用程序。 - 所有其他资源端点仍然受到 JWT Passport 策略的保护。AngularJS 应用程序每次想要访问它们时都需要发送 JWT 令牌。
希望它有助于设计一个明确的解决方案。
推荐阅读
- java - 我可以在 JPanel 上使用 actionListeners 吗?
- javascript - 使用 Jquery 检查 MVC 模型属性是否为空
- amazon-web-services - 将自定义身份验证服务与 AWS Cognito 集成
- python-3.x - python将unicode文本反转为可读
- sql - 查询 SQL 表中出现的百分比
- python-3.x - 显示动态数字的多个项目的总和
- wordpress - 使用原始分辨率图像从 Blogger 导入 Wordpress
- wordpress - 多个 ACF 字段的 Wordpress 顺序
- ios - 使用容器视图时,Delegate 为 nil
- python - 关于为什么建议的 Sentry LOGGING 设置有效的问题