创建与OAuth兼容的SSO:与客户端的问题

我希望在应用程序上创建类似Google的单点登录,以便我们的应用程序的成员可以访问所有其他应用程序,而无需再次登录。

但是我找不到正确的方法来实现它,我想我错过了grant_type = authorization_code方法,特别是RFC 6749的这部分内容:

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

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

因此,当客户端(“应用程序”)需要access_token时,它将被重定向到SSO,它本身会在Authorization标头中请求具有应用程序的client_id和我的SSO的access_token的authorization_code以知道哪个用户想要访问资源。

问题在于:我的SSO的access_token是为SSO的client_id创建的,而不是应用的client_id。 因此,使用为一个客户端生成的access_token来标识授予另一个客户端对某些资源的访问权限的用户似乎很无聊/无效。

这是一个(简化的)模式,用于更好地理解流程:

 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 = password的授权服务器来获取access_token。

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

在第16行中,一旦用户点击“授权”授予客户端访问资源,SSO就会以授权标头中SSO的access_token的名义向OAuth服务器请求授权码,以识别该用户。

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


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

“某些SSO应用程序”可能是您自己开发的内容,也可能是外部提供商,它说的是像SAML或OpenID Connect这样的标准化SSO协议,例如Google或Microsoft。

链接地址: http://www.djcxy.com/p/47975.html

上一篇: Create an OAuth compatible SSO: troubles with client

下一篇: SSO & Existing OAuth integrations