Oauth 2.0 单页应用程序(SPA)的单点登录(SSO)解决方案/体系结构

Oauth 2.0 单页应用程序(SPA)的单点登录(SSO)解决方案/体系结构,oauth-2.0,single-sign-on,single-page-application,openid-connect,auth0,Oauth 2.0,Single Sign On,Single Page Application,Openid Connect,Auth0,我研究SPA的SSO解决方案已经有一段时间了。有很多解决方案存在细微的差异,但我也发现并非所有人都对SSO有相同的理解,也没有太多为SPA建立的SSO模式。因此,我并不要求详细的设计/架构,只是想看看在这个主题上是否有任何常见的实践 我对SSO意味着什么? 我们正在开发一些新的SPA(也可能是移动和平板电脑应用程序),它们将部署在不同的服务器上,并具有不同的域 我们还有一个中央IdP(authServer),其中存储所有用户标识 一旦我登录到SPA1并单击一个按钮将我带到SPA2(或SPA3,S

我研究SPA的SSO解决方案已经有一段时间了。有很多解决方案存在细微的差异,但我也发现并非所有人都对SSO有相同的理解,也没有太多为SPA建立的SSO模式。因此,我并不要求详细的设计/架构,只是想看看在这个主题上是否有任何常见的实践

我对SSO意味着什么?

  • 我们正在开发一些新的SPA(也可能是移动和平板电脑应用程序),它们将部署在不同的服务器上,并具有不同的域
  • 我们还有一个中央IdP(authServer),其中存储所有用户标识
  • 一旦我登录到SPA1并单击一个按钮将我带到SPA2(或SPA3SPA4),我就不必输入用户凭据,将自动登录 水疗有什么不同?(与常规web应用相反)

    我看过一些解决方案,甚至是像SAML这样的旧解决方案(只是想了解一下SSO…)。我目前的候选者是,但如果我的理解正确的话,我意识到SPA有一个不同之处:与常规web应用程序不同,SPA通常没有(或我们尝试没有)后端服务器。SPA所拥有的只是一个服务于静态页面以及脚本、样式表和图像的服务器

    现在问题来了:

    基于授权代码授权类型,即:

  • 如果我想让每个SPA工作,我需要一个后端代理模块
  • 我使用不同的解决方案来执行客户端SSO,例如
  • 我没有找到任何其他解决方案/示例
  • 我的问题:

    对于以上第1点,我的理解正确吗?不让SPA像普通web应用程序那样拥有后端代码更好吗

    对于上面的第2点,这听起来像是一个解决方案,但它与隐式赠款类型有何本质区别


    还有,还有其他解决方案(框架、协议等)我应该知道,但还没有研究过吗?

    除了使用授权码授权的基本客户端配置文件外,OpenID Connect还有一个基于OAuth 2.0的隐式授权的隐式客户端配置文件。此配置文件允许在不涉及后端的情况下将令牌直接交付到浏览器/Javascript客户端。

    现在,代码流与跨源资源共享()和代码交换验证密钥()结合使用,也可用于单页应用程序

    详细描述了以安全方式为SPA实现OAuth/OpenID Connect时应使用的当前步骤。当前最佳实践总结如下:

    近年来,广泛采用跨来源资源共享 (CORS)允许对同一原产地政策进行例外,允许 使用OAuth 2.0授权代码流和 发出POST请求以交换访问权限的授权代码 令牌端点处的令牌。在此流中,访问令牌永远不会被删除 暴露在不太安全的前通道中。此外,添加PKCE 即使授权代码是 如果被拦截,攻击者将无法使用它

    因此,从其他经验教训来看,目前是最好的 基于浏览器的应用程序的实践是使用OAuth 2.0 使用PKCE的授权代码流。

    草案恢复了以下要点,在为SPA(或其他公共客户端)实现OAuth/OpenID时,您应该考虑这些要点:

    基于浏览器的应用程序:

    • 必须将OAuth 2.0授权代码流与PKCE一起使用 获取访问令牌时的扩展

    • 必须通过以下方式保护自己免受CSRF攻击:

      • 确保授权服务器支持PKCE,或

      • 通过使用OAuth 2.0“state”参数或OpenID Connect 携带一次性使用CSRF令牌的“nonce”参数

    • 必须注册一个或多个重定向URI,并且仅使用精确的 授权请求中已注册的重定向URI


    脚本是指服务器、客户端还是双方?我想很多SPA都可以使用jQuery通过AJAX调用后端服务器,但可能我在这里遗漏了一些东西。@JBKing您肯定是对的。脚本主要指javascript,它可以对后端服务器进行AJAX调用,但不需要对同一服务器i映像进行调用,例如,它可以通过调用order service获取订单列表,而通过调用product service获取产品详细信息。订单服务和产品服务可以是微服务,部署在完全不同的服务器上。您找到解决方案了吗?非常感谢!因此,如果我采用这种方法,那么我想我还需要启用CORS(因为我的身份验证服务器和其他后端服务服务器可以位于不同的域中)。你看到有什么安全问题吗?请你再解释一下好吗?嗨@Slavafomini,我试图给出更多细节,并引用了RCF的相关部分。如果您有进一步的问题或建议,请告诉我如何改进我的答案:)谢谢,这是一个很好的总结。