我正在尝试使用 openid connect 为我的应用程序创建 SSO。
基本上我们有一个 API 层,不同的应用程序(客户端)将使用这一层的服务。
首先,我们为每个不同的应用程序添加了 OAuth2.0 授权;对于身份验证,我们目前使用我们自己的数据库 (IDP)
我们希望最终用户拥有此流程的单点登录体验。
为此,我们在我们构建的 OAuth 流程之上添加了 openid。
Web 服务器具有标准的 oauth + openid 实现,并具有以下内容
添加 openid 连接后,服务器现在也可以发送 id_token (jwt),具体取决于范围和请求类型
注册了两个客户端(C1 和 C2)
步骤 1:C1 遵循显式流程并使用响应类型作为代码,因此当用户 (U1) 访问 C1 时,它被重定向到 U1 输入凭据的身份验证服务器。
步骤2:授权服务器验证凭据并提示用户同意,确认谁将代码发送到C1的redirect_uri
第三步:C1然后请求一个token,服务器给出一个access_token和一个id_token;访问 token 保存在数据库中
第 4 步:U1 现在需要访问 C2
问题:
谢谢
最佳答案
流量的选择取决于客户的类型。例如,客户端可能是一个 native 应用程序,它可以使用授权代码流(我猜您将显式流称为此流)。或仅在浏览器上运行的 JavaScript 应用程序。
解决方案 - 基于 session cookie 的 SSO
在 OAuth 2.0(包括 OpenID Connect)中,最终用户(例如:如您的示例中的 U1)身份验证通过浏览器交互进行。在这个过程中,通常授权服务器建立 session 。此 session 所做的是保留对先前经过身份验证的用户的引用。例如,这允许用户访问 IDP 并更新用户在那里的内容(如果您的身份提供商支持)。
现在,如果两个应用程序使用相同的浏览器(例如:- Microsoft Edge)在 OpenID Connect 的授权请求中显示登录屏幕,您的授权服务器可以检查浏览器存在的 session cookie。如果是这种情况,授权服务器可以跳过登录屏幕和相关内容的响应。以下是全新登录的示例场景
现在 C1 和 C2 都有 U1 用户登录到它们。这是基于浏览器的 SSO。
关于security - 使用 openid connect 作为多个应用程序的 SSO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51824340/