我基于OAuth2开发了SSO系统。
我有3种服务:
包含用户和OAuth2服务器的SSO身份提供程序- http://sso.idp.loc
SSO服务提供商,其前端部分位于Angular-http://sso.sp-angular.loc
服务提供者检查身份提供者发出的每个请求访问令牌。
机制是下一个:
Cookie包含oauth访问权限和令牌。
访问令牌有效时,一切都很好。 一旦访问令牌过期,服务生产者将转到sso.idp.loc / login_check并再次检查访问令牌,然后使用刷新令牌尝试获取新的令牌。 如果成功,则将新凭据设置为sso.idp.loc和服务提供者。 假设发生在sso.sp-web.loc。
这里我有几个问题:
应该认为访问令牌可以随时更改。
我的系统可能出了点问题。 我将很高兴为您提供任何解决方案。
答案 0 :(得分:0)
您似乎已经实现了OAuth 2.0的隐式授予类型。这很没有安全感。理想情况下,您应该实现授权码授予类型,并在资源服务器(称为服务提供者)端维护客户端机密。建议您阅读答案here和here。
现在让我们回答查询:
如果您正确设置了cookie的domain属性,则第一台资源服务器设置的cookie也应对第二台服务器可用。
当用户正在编辑表单并且令牌过期时,资源服务器中的api筛选器可以检测到过期的令牌并将401响应代码返回给客户端。在接收到401时,客户端或浏览器可以在服务器中进行另一个api调用以更新访问令牌。 api将从cookie中获取刷新令牌,并使用客户端密钥和刷新令牌调用授权服务器以获取新的访问令牌。如果刷新标记未过期,授权服务器将返回一对新的访问和刷新令牌,这些令牌将返回到浏览器和cookie集。浏览器现在将使用新的访问令牌再次调用表单Submit api。所有这些将对用户无缝发生。仅当刷新令牌过期时才会发生完全失败。
与2中提到的方法相同。
答案 1 :(得分:0)
我认为您的SSO概念有缺陷-您不应共享相同的令牌。每个客户端(应用程序)的令牌应该不同。 OAuth2 SSO通常以以下方式实现(OAuth2 RFC并未涵盖该实现):
/auth
端点)来请求令牌。/auth
端点请求。授权服务器解析该会话。该会话已经过身份验证,因此授权服务器可以决定不要求提供凭据并立即释放新令牌(或身份验证代码)。