基于OAuth2的单一登录

时间:2019-02-14 12:34:14

标签: symfony oauth-2.0 single-sign-on

我基于OAuth2开发了SSO系统。

我有3种服务:

  1. 包含用户和OAuth2服务器的SSO身份提供程序- http://sso.idp.loc

  2. SSO服务提供商,其前端部分位于Angular-http://sso.sp-angular.loc

  3. SSO服务提供商(休闲网站)-http://sso.sp-web.loc

服务提供者检查身份提供者发出的每个请求访问令牌。

机制是下一个:

  1. 转到任何服务提供商,然后按登录
  2. 重定向到sso.idp.loc / login_check以检查凭据(从cookie)。
  3. 如果未获得授权-转到sso.idp.loc / login。
  4. 登录后-为身份提供商设置cookie,并使用get参数中的这些cookie重定向到目标服务提供商。
  5. 通过get参数为服务提供商设置新的Cookie,然后重定向到目标路径。
  6. 如果服务提供商的身份验证突然失败,请转到sso.idp.loc / login_check,并提供目标路径。

Cookie包含oauth访问权限和令牌。

访问令牌有效时,一切都很好。 一旦访问令牌过期,服务生产者将转到sso.idp.loc / login_check并再次检查访问令牌,然后使用刷新令牌尝试获取新的令牌。 如果成功,则将新凭据设置为sso.idp.loc和服务提供者。 假设发生在sso.sp-web.loc。

这里我有几个问题:

  1. 然后另一个服务提供商sso.sp-angular.loc不知道凭据已更改,下一个请求将重定向到sso.idp.loc / login_check(可以通过第二次发送请求来解决)。
  2. 当用户在sso.sp-web.loc上编辑表单并且令牌已过期时,提交将失败。
  3. 令牌到期后如何管理ajax调用?

应该认为访问令牌可以随时更改。

我的系统可能出了点问题。 我将很高兴为您提供任何解决方案。

2 个答案:

答案 0 :(得分:0)

您似乎已经实现了OAuth 2.0的隐式授予类型。这很没有安全感。理想情况下,您应该实现授权码授予类型,并在资源服务器(称为服务提供者)端维护客户端机密。建议您阅读答案herehere

现在让我们回答查询:

  1. 如果您正确设置了cookie的domain属性,则第一台资源服务器设置的cookie也应对第二台服务器可用。

  2. 当用户正在编辑表单并且令牌过期时,资源服务器中的api筛选器可以检测到过期的令牌并将401响应代码返回给客户端。在接收到401时,客户端或浏览器可以在服务器中进行另一个api调用以更新访问令牌。 api将从cookie中获取刷新令牌,并使用客户端密钥和刷新令牌调用授权服务器以获取新的访问令牌。如果刷新标记未过期,授权服务器将返回一对新的访问和刷新令牌,这些令牌将返回到浏览器和cookie集。浏览器现在将使用新的访问令牌再次调用表单Submit api。所有这些将对用户无缝发生。仅当刷新令牌过期时才会发生完全失败。

  3. 与2中提到的方法相同。

答案 1 :(得分:0)

我认为您的SSO概念有缺陷-您不应共享相同的令牌。每个客户端(应用程序)的令牌应该不同。 OAuth2 SSO通常以以下方式实现(OAuth2 RFC并未涵盖该实现):

  1. 应用程序“ App1”通过将用户的浏览器重定向到授权服务器(/auth端点)来请求令牌。
  2. 授权服务器将会话cookie设置到浏览器,并保留有关在该会话中验证了哪个用户的信息。 Cookie仅对授权服务器请求有效。
  3. 当另一个应用程序“ App2”请求令牌时,浏览器将发送会话cookie和/auth端点请求。授权服务器解析该会话。该会话已经过身份验证,因此授权服务器可以决定不要求提供凭据并立即释放新令牌(或身份验证代码)。