当前位置: 首页 > 知识库问答 >
问题:

创建一个OAuth兼容的SSO:与client_id mixups有关的问题

钱星辰
2023-03-14

我想创建类似谷歌的单点登录应用程序,让我们的一个应用程序的成员到达所有其他应用程序,而不需要再次登录。

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

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

这里有一个问题:我的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行,我们假设user没有登录,所以user在SSO UI上输入它的凭据,然后SSO将使用它自己的client_id和grant_type=password调用授权服务器以获得access_token。

在第13行,access_token是给SSO的,它是一个access_token,将user_id与SSO的client_id绑定在一起,这样我们在集中式应用程序中登录用户,我们不再需要登录他。

共有1个答案

贺文彬
2023-03-14

在这样的常规设置中,客户机和授权服务器之间没有SSO应用程序,但是客户机将使用标准的OAuth2.0直接集成到授权服务器中,授权服务器将与一些SSO应用程序集成以对用户进行身份验证。

“一些SSO应用程序”可以是您自己开发的东西,也可以是使用标准SSO协议的外部提供商,如SAML或OpenID Connect,例如Google或Microsoft。

 类似资料:
  • 本文向大家介绍CodeIgniter与PHP5.6的兼容问题,包括了CodeIgniter与PHP5.6的兼容问题的使用技巧和注意事项,需要的朋友参考一下 错误提示: 原代码: 修改后: 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 我正在尝试创建用于AWS IoT的自签名X.509证书。我可以理解它与普通的OpenSSL证书没有什么不同,但我偶然发现AWS创建的PEM文件有些不同。因为我是OpenSSL新手,所以我无法找出我缺少了什么 我使用下面的命令创建私钥、CSR和服务器证书 openssl req-newkey rsa: 2048-new-节点-keyoutkey.pemcsr.pem openssl x509-req

  • 我的项目计划使用SSO(可能使用Gluu或Auth0,…)并且正在考虑将GraphQL应用到我们的API中。 乍一看,这两个应该很容易兼容,因为它们在不同的层上工作。但是我仍然想听听有这两个方面经验的人在将它们应用于项目时是否有任何问题、考虑因素或指导方针?

  • “email”节点以前是从另一个“people.csv”文件创建的,并且“email”节点存在唯一性约束。在上面的行中,我希望通过关系将“created_by”、“delivered_to”和“delivered_by”节点与之前创建的“email”节点合并。当我运行代码时,它给出了错误,并且没有从CSV中创建any节点。如何组织密码查询以防止此错误?谢了。

  • 我很感激你的帮助,我真的卡住了。 我试图在Kibana中创建一个简单的可视化,这是一个基于我的数据中的数字值(origin_file_size_bytes)的线图。当我试图添加一个可视化图时,我得到了这个错误: 没有兼容的字段:“test*”索引模式不包含以下任何字段类型:number或date 我的实际索引确实包含一个带数字的字段,我的数据也是如此。 谢谢你的帮助! 安德鲁 下面是Discove

  • 在我的身材中。gradle file I升级了一个依赖项的版本(即:com.db:microservice commons)。加载gradle更改后,我收到以下错误消息: 文件“C:\Projects\Container\mschmidt\mount\booking service\standalone\build”的第50行。gradle的外观如下: 我不知道该怎么办。JDK项目和Gradle