我想创建类似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 回答
在这样的常规设置中,客户端和授权服务器之间不会有SSO应用程序,但客户端将直接与标准OAuth 2.0集成到授权服务器,并且授权服务器将与某些SSO应用程序集成以对用户进行身份验证 .
“某些SSO应用程序”可能是您自己开发的,也可能是外部提供程序,它使用标准化的SSO协议,如SAML或OpenID Connect,例如:谷歌或微软 .