node.js - 使用 angular、node.js 和身份提供者的 SAML 身份验证

标签 node.js angular passport.js saml saml-2.0

我想使用 SAML2 实现 SSO。 但我不知道如何让它与分布式系统一起工作,在分布式系统中,每个实例都在自己的服务器上独立运行。环境由三个实例组成:

  • 实例 #1: Angular 前端
  • 实例 #2:node.js 后端(使用 express.js + passport)
  • 实例 #3:SAML 实例(身份提供者)

问题是,如果前端调用 protected 后端路由,最佳方法是什么? 哪些行动顺序可以被视为良好做法?

此刻我脑子里有这样的行为:

  1. 前端向 protected 后端路由发送请求
  2. 由于用户未通过身份验证,服务器启动重定向到身份提供商提供的 SSO 页面。
  3. 在那里输入凭据
  4. 用户通过 saml 实例进行身份验证,并将请求发送回服务器。
  5. 现在用户已通过身份验证,服务器将请求资源的响应发送回客户端。

但只要我想到这个顺序,我就意识到这是行不通的。 这是因为前端是它自己的实例并且它独立于后端。 如果您有一个单独的前端实例,则由 Passport 发起的到 SSO 页面的重定向将不起作用。 如果您直接使用浏览器调用 protected 路由,它会起作用,因为那样您只有两个通信伙伴(服务提供者和身份提供者)而不是三个。 但这里不是这种情况。

感谢和问候

菲利普

最佳答案

我在以前的工作中用这个 logique 做过类似的事情:

  1. 在 Angular 中实现一个登录页面(获取凭据的简单表单),然后在后端调用登录服务。
  2. 该后端登录服务应根据身份提供者验证前端提供的凭据(我相信他们会为您提供一个 URL,您可以在其中注入(inject)这些参数)。
  3. 验证身份后,调用后端的认证服务为该用户生成 token (Passport JS 应该完成这项工作),然后将此 token 发送回前端。
  4. 在前端,实现一个守卫,它应该处理 token /将用户凭证设置到本地存储...
  5. 在前端,还实现一个拦截器,在每个 XHR header 中注入(inject)此 token ,或在 token 不存在或过期时将用户重定向到登录表单。
  6. 在后端,logique 将是经典的(在发回数据之前从 XHR header 验证 token 有效性/如果验证失败则告诉前端登录)。

使用此逻辑,您将使前端远离身份提供者并与后端保持一致。

关于node.js - 使用 angular、node.js 和身份提供者的 SAML 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65250156/

相关文章:

Javascript 将 bigInt 转换为字符串

node.js - 从 v4.0.0 开始需要明确提供方言

mysql - SQLSTATE[23000] 在非空列上 [ANGULAR 5 & NODEJS]

angular - 检查 api 是否从 Angular 客户端应用程序关闭

api - 我应该为我的 API 使用哪种身份验证策略?

node.js - 从 Firebase 函数访问 Google 网站验证 API

java - 带有单页 angular2 重定向的 Spring Boot

angular - 防止在 Angular Firebase 注销后在浏览器控制台中写入错误

mysql - 如果我使用 IP 地址运行 NodeJS 服务器, session 不会初始化

mysql - 使用 Node 模块化 Passport.js 时出现问题