单页应用程序(SPA)的单点登录(SSO)解决方案/架构

6
我已经研究了一段时间的SPAs单点登录解决方案。有很多解决方案有微妙的差别,同时我也发现并不是每个人都对SSO有相同的理解,并且没有太多针对SPA的SSO模式被建立。因此,我并不要求详细的设计/架构,而只是想看看这个主题上是否有任何通用做法。
我所说的SSO是什么意思?
1.我们正在开发几个新的SPAs(也可能是移动和平板应用程序),它们将部署在不同的服务器上并具有不同的域名。 2.我们还有一个中央IdP(authServer),其中存储所有用户标识。 3.一旦我登录了SPA1并点击一个按钮将我带到SPA2(或SPA3、SPA4等),我就不必输入用户凭据,会自动登录。
SPA与常规Web应用程序的区别是什么?
我看了一些解决方案,甚至包括旧的解决方案,如SAML(只是想了解一下SSO...)。我目前的候选方案是OpenId Connect,但后来意识到SPA有一个区别,如果我理解正确:与常规Web应用程序不同,SPA通常没有(或者我们尽量不要有)后端服务器。 SPA只有一个服务器提供静态页面以及脚本、样式表和图像。 现在出现了问题: OpenId Connect基于OAuth2授权码授权类型,这意味着要么:
  1. 如果我想让它工作,我需要为每个SPA使用类似于后端代理的模块。
  2. 我使用不同的解决方案来进行客户端SSO,例如auth0提供的解决方案
  3. 我没有找到其他解决方案/示例
我的问题是:
关于第一点,我的理解是否正确?不让SPA拥有像常规网络应用程序那样的后端代码会更好吗?
对于第二点,那听起来像是一个解决方案,但它在本质上与OAuth2 Implicit授权类型有什么不同?
还有其他的解决方案(框架、协议等)吗,我需要知道但尚未探索的?

你所说的脚本是指服务器端、客户端还是两者都包括?我想很多单页应用程序可以使用jQuery通过AJAX调用后端服务器,但也许我漏掉了什么。 - JB King
@JBKing 您说得很对。脚本通常指的是JavaScript,它可以向后端服务器发起AJAX调用,但不一定是同一台服务器,例如,它可以通过调用订单服务获取订单列表,同时通过调用产品服务获取产品详情。订单服务和产品服务可以是微服务,并部署在完全不同的服务器上。 - Faraway
1
你找到解决方案了吗? - Muhammad Usama Mashkoor
2个回答

2
现在,Code Flow结合跨源资源共享(CORS)和代码交换的证明密钥(PKCE)也可以用于单页应用程序。
“面向浏览器的OAuth 2.0”草案详细描述了您应该使用的当前步骤,以安全的方式实现SPAs的OAuth/OpenID Connect。在第4节“概述”中总结了当前的最佳实践。
近年来,广泛采用跨域资源共享(CORS)技术,该技术允许同源策略的例外情况,使基于浏览器的应用程序能够使用OAuth 2.0授权代码流程,并在令牌端点处进行POST请求以交换授权代码和访问令牌。在此流程中,访问令牌永远不会在不安全的前端暴露。此外,将PKCE添加到流程中可以确保即使授权代码被拦截,攻击者也无法使用它。
因此,从其他经验教训中得出的结论是,基于浏览器的应用程序的当前最佳实践是使用带有PKCE的OAuth 2.0授权代码流程。
这篇草案总结了以下关键要点,当您为SPA(或其他公共客户端)实现OAuth/OpenID时,您应该考虑这些要点:
基于浏览器的应用程序:
  • 在获取访问令牌时,必须使用OAuth 2.0授权代码流和PKCE扩展
  • 必须通过以下方式之一保护自己免受CSRF攻击:
    • 确保授权服务器支持PKCE,或者
    • 使用OAuth 2.0“state”参数或OpenID Connect“nonce”参数携带一次性使用的CSRF令牌
  • 必须注册一个或多个重定向URI,并且只能在授权请求中使用精确注册的重定向URI

你能再解释一下吗? - Slava Fomin II
嗨@SlavaFominII,我尝试提供更多细节,并引用了RCF中相关的部分。如果您有进一步的问题或建议如何改进我的答案,请告诉我 :) - katexochen
谢谢,这是一个很好的总结。 - Slava Fomin II

1
除了使用授权码授予的基本客户端配置文件外,OpenID Connect 还具有一个隐式客户端配置文件,该配置文件基于 OAuth 2.0 的隐式授权。此配置文件允许在浏览器/JavaScript 客户端上直接提供令牌,而无需涉及后端。

非常感谢!如果我采用这种方法,那么我想我也需要启用CORS(因为我的Auth服务器和其他后端服务服务器可能在不同的域中)。您是否看到任何安全问题? - Faraway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接