使用 angular、node.js 和身份提供者的 SAML 身份验证
SAML-Authentication using angular, node.js and an identity provider
我想使用 SAML2 实现 SSO。
但我不知道如何让它与每个实例 运行 独立在自己的服务器上的分布式系统一起工作。环境由三个实例组成:
- 实例 #1:angular 前端
- 实例 #2:node.js 后端(使用 express.js + passport)
- 实例 #3:SAML 实例(身份提供商)
问题是,如果前端调用受保护的后端路由,最好的方法是什么?
哪些动作顺序可以被视为良好做法?
此刻我脑子里有这样的行为:
- 前端向受保护的后端路由发送请求
- 由于用户未通过身份验证,服务器启动重定向到身份提供商提供的 SSO 页面。
- 在那里输入了凭据
- 用户通过 saml 实例进行身份验证,并将请求发送回服务器。
- 现在用户已通过身份验证,服务器将请求资源的响应发送回客户端。
但只要我想到这个序列,我就意识到这是行不通的。
这是因为前端是它自己的实例并且它独立于后端。
如果您有一个单独的前端实例,则由护照发起的到 SSO 页面的重定向将不起作用。
如果您直接使用浏览器调用受保护的路由,它会起作用,因为那样您只有两个通信伙伴(服务提供者和身份提供者)而不是三个。
但这里不是这样。
感谢和问候
菲利普
我在之前的工作中用这个逻辑做过类似的事情:
- 在Angular中实现一个登录页面(获取凭据的简单表单),然后在后端调用登录服务。
- 该后端登录服务应根据身份提供者验证前端提供的凭据(我相信他们会为您提供一个 url,您可以在其中注入这些参数)。
- 验证身份后,在后端调用认证服务为该用户生成一个令牌(Passport JS 应该完成这项工作),然后将该令牌发送回前端。
- 在前端,实现一个应该处理令牌/将用户凭证设置到本地存储的守卫...
- 在前端,还实现一个拦截器,在每个 XHR 中注入此令牌 header 或在令牌不存在或过期的情况下将用户重定向到登录表单。
- 在后端,logique 将是经典的(在发回数据之前从 XHR header 验证令牌有效性/如果验证失败则告诉前端登录)。
使用此逻辑,您将使前端远离身份提供者并与后端保持一致。
我想使用 SAML2 实现 SSO。 但我不知道如何让它与每个实例 运行 独立在自己的服务器上的分布式系统一起工作。环境由三个实例组成:
- 实例 #1:angular 前端
- 实例 #2:node.js 后端(使用 express.js + passport)
- 实例 #3:SAML 实例(身份提供商)
问题是,如果前端调用受保护的后端路由,最好的方法是什么? 哪些动作顺序可以被视为良好做法?
此刻我脑子里有这样的行为:
- 前端向受保护的后端路由发送请求
- 由于用户未通过身份验证,服务器启动重定向到身份提供商提供的 SSO 页面。
- 在那里输入了凭据
- 用户通过 saml 实例进行身份验证,并将请求发送回服务器。
- 现在用户已通过身份验证,服务器将请求资源的响应发送回客户端。
但只要我想到这个序列,我就意识到这是行不通的。 这是因为前端是它自己的实例并且它独立于后端。 如果您有一个单独的前端实例,则由护照发起的到 SSO 页面的重定向将不起作用。 如果您直接使用浏览器调用受保护的路由,它会起作用,因为那样您只有两个通信伙伴(服务提供者和身份提供者)而不是三个。 但这里不是这样。
感谢和问候
菲利普
我在之前的工作中用这个逻辑做过类似的事情:
- 在Angular中实现一个登录页面(获取凭据的简单表单),然后在后端调用登录服务。
- 该后端登录服务应根据身份提供者验证前端提供的凭据(我相信他们会为您提供一个 url,您可以在其中注入这些参数)。
- 验证身份后,在后端调用认证服务为该用户生成一个令牌(Passport JS 应该完成这项工作),然后将该令牌发送回前端。
- 在前端,实现一个应该处理令牌/将用户凭证设置到本地存储的守卫...
- 在前端,还实现一个拦截器,在每个 XHR 中注入此令牌 header 或在令牌不存在或过期的情况下将用户重定向到登录表单。
- 在后端,logique 将是经典的(在发回数据之前从 XHR header 验证令牌有效性/如果验证失败则告诉前端登录)。
使用此逻辑,您将使前端远离身份提供者并与后端保持一致。