我想创建类似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为其他客户端识别用户,我认为它无效。有人可以给我一些建议吗?
答案 0 :(得分:1)
在这样的常规设置中,客户端和授权服务器之间不会有SSO应用程序,但客户端将直接与标准OAuth 2.0集成到授权服务器中,授权服务器将与某些SSO应用程序集成以验证用户身份。
“某些SSO应用程序”可能是您自己开发的,也可能是外部提供商,它使用标准化的SSO协议,如SAML或OpenID Connect,例如:谷歌或微软。