创建与OAuth兼容的SSO:遇到client_id混乱问题

时间:2017-02-28 18:36:10

标签: api security oauth oauth-2.0 single-sign-on

我想创建类似Google的单点登录应用程序,以允许我们的某个应用程序的成员访问所有其他应用程序,而无需再次登录。

但我无法找到正确的方法,我认为我遗漏了使用grant_type = authorization_code方法的内容,尤其是this part of the RFC 6749

  

(B)授权服务器验证资源所有者(通过           用户代理)并确定资源所有者           授予或拒绝客户的访问请求。

SSO应用程序本身就是具有自己的client_id的OAuth客户端,因此当用户进行身份验证时,SSO会为这对夫妇(SSO,用户)获取access_token,并将其存储到SSO的会话中以供进一步使用。

因此,当客户端("应用程序")需要access_token时,它将被重定向到SSO,它本身将通过应用程序的client_id和我的SSO'来请求authorization_code。在Authorization标头中的access_token,以了解哪个用户想要访问该资源。

问题在于:我的SSO的access_token是为SSO的client_id而不是应用程序的client_id创建的。因此,使用为一个客户端生成的access_token来识别授予另一个客户端访问某些资源的用户似乎是hacky / invalid。

这是一个(简化的)架构,可以更好地理解流程:

 01  User                        Client                        SSO                     OAuth Server 01
 02   +                             +                           +                            +      02
 03   |                             |                           |                            |      03
 04   | User requests resource      |                           |                            |      04
 05   | +-------------------------> |                           |                            |      05
 06   |                             |                           |                            |      06
 07   |                             | Client redirects to SSO   |                            |      07
 08   |                             | +-----------------------> |                            |      08
 09   |                             |                           |                            |      09
 10   |                             |                           |  SSO authenticates user    |      10
 11   |                             |                           | +------------------------> |      11
 12   |                             |                           |                            |      12
 13   |                             |                           |  token stored on SSO side  |      13
 14   |                             |                           | <------------------------+ |      14
 15   |                             |                           |                            |      15
 16   |                             |                           |  SSO requests grant code   |      16
 17   |                             |                           | +------------------------> |      17
 18   |                             |                           |                            |      18
 19   |                             | authorization code returned to client                  |      19
 20   |                             | <----------------------------------------------------+ |      20
 21   |                             |                           |                            |      21
 22   |                             | authorization code exchanged for an access_token       |      22
 23   |                             | +----------------------------------------------------> |      23
 24   |                             |                           |                            |      24
 25   |                             | access_token returned to client                        |      25
 26   |                             | <---------------------------------------------------+  |      26
 27   |                             |                           |                            |      27
 28   | user can access resource    |                           |                            |      28
 29   | <-------------------------+ |                           |                            |      29
 30   +                             +                           +                            +      30

在第10行,我们假设用户未登录,因此用户在SSO UI上输入其凭据,然后SSO将使用自己的client_id和grant_type =密码调用授权服务器以获取access_token。

在第13行,access_token被提供给SSO,它是一个access_token,用于将user_id与SSO的client_id绑定,这样我们就可以在集中式应用程序中登录用户,而且我们不会这样做。我需要再登录他了。

在第16行,一旦用户点击&#34;授权&#34;为了授予客户端访问资源,SSO代表用户向OAuth服务器请求授权代码,并在授权标头中使用SSO的access_token来标识该用户。

在我的流程中,SSO access_token为其他客户端识别用户,我认为它无效。有人可以给我一些建议吗?

1 个答案:

答案 0 :(得分:1)

在这样的常规设置中,客户端和授权服务器之间不会有SSO应用程序,但客户端将直接与标准OAuth 2.0集成到授权服务器中,授权服务器将与某些SSO应用程序集成以验证用户身份。

“某些SSO应用程序”可能是您自己开发的,也可能是外部提供商,它使用标准化的SSO协议,如SAML或OpenID Connect,例如:谷歌或微软。