首页 文章

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

提问于
浏览
1

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

但我可以使用grant_type = authorization_code方法丢失一些内容,尤其是this part of the RFC 6749

(B)授权服务器对资源所有者进行身份验证(通过用户代理),并确定资源所有者是否授予或拒绝客户端的访问请求 .

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

因此,当客户端(“app”)需要access_token时,它将被重定向到SSO,SSO本身将使用应用程序的client_id和Authorization标头中的SSO的access_token请求authorization_code,以了解哪个用户想要访问该资源 .

这就是问题所在:我的SSO的access_token是为SSO的client_id而不是app的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行,一旦用户点击“授权”授予客户端访问资源,SSO就代表用户向OAuth服务器请求授权代码,并在授权标头中使用SSO的access_token来标识该用户 .

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

1 回答

  • 1

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

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

相关问题