使用 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 的移动客户端的社交身份验证