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

Posted

技术标签:

【中文标题】使用 Angular、node.js 和身份提供者的 SAML 身份验证【英文标题】:SAML-Authentication using angular, node.js and an identity provider 【发布时间】:2021-03-22 19:10:03 【问题描述】:

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

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

问题是,如果前端调用受保护的后端路由,最好的方法是什么? 哪些操作顺序可以被视为良好做法?

目前我脑子里有这种行为:

    前端向受保护的后端路由发送请求 由于用户未通过身份验证,服务器会启动重定向到身份提供者提供的 SSO 页面。 在那里输入凭据 用户通过 saml 实例进行身份验证,并将请求发送回服务器。 现在用户已通过身份验证,服务器将带有请求资源的响应发送回客户端。

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

感谢和问候

菲利普

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

非常感谢。这听起来很棒。我会试一试。我考虑过另一种可能的解决方案:如果用户未通过身份验证,则后端将错误发送回前端。将启动到 SSO 登录页面的重定向 (window.location.href)。这要求前端知道 IDP。用户输入凭据并通过 IDP 身份验证后,它会向回调路由发送请求,...如果可行,我将发布此解决方案。 @mayerph 您的解决方案有效吗?还是您选择了其他方式。

以上是关于使用 Angular、node.js 和身份提供者的 SAML 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 passport-auth0 进行 MEAN Stack 用户身份验证,在 Angular 中调用 Node Js passport-auth0 API

如何将 Angular 4 添加到现有的 node.js 应用程序

httpOnly cookie 中的 JWT - AuthGuard 和受保护的路由(Node.js、Angular)

来自连接到 Node.js API 的移动客户端的社交身份验证

使用 Angular.js 和 Node.js 构建实时应用程序的更好方法是啥?

使用 http 时,req.body 为空 。在 angular 和 node.js 中发布