oauth2.0 使用第二个Keycloak IdP进行Keycloak代理

rsl1atfo  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(127)

我开始告诉我不是这个领域的Maven,所以这是我第一次处理的东西。我安装由4演员组成的架构:

  • 一个Keycloak,将作为身份提供者(IdP)运行。这将与LDAP目录连接,以管理系统的所有身份。为了区分它,从现在开始我将其称为Keycloak_1(在端口8080上);
  • 一个充当经纪人的Keycloak。我叫它Keycloak_2(在端口9000上)。我使用上述应用程序只是为了获得我的应用程序的授权令牌。这个想法(未来)是拥有多个IdP(例如Keycloak_1)和一个代理来管理来自不同租户的身份。使用部分身份提供程序(如照片所示,还激活本教程的设置https://www.keycloak.org/docs/latest/server_admin/#retrieving-external-idp-tokens); x1c 0d1x
  • 第三个参与者是一个API GW,即Apache APISIX,它可以通过一个本地插件(authz-keycloak:https://apisix.apache.org/docs/apisix/plugins/authz-keycloak/)连接到Keycloak。在这个插件中,我想将来自Keycloak_2的那个设置为令牌端点;
  • 最后一个参与者是要保护的资源,即通过REST API可访问的微服务;

我想遵循的流程是。我希望用户能够连接Keycloak_1来验证自己。验证后,他能够发送POST请求,如下所示,并接收令牌:

curl --location 'http://KEYCLOAK_1:8080/realms/REALM_1/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=TEST' \
--data-urlencode 'username=dummy1' \
--data-urlencode 'password=dummy1' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'client_secret=SECRET' 

**RESPONSE**:
{
    "access_token": "TOKEN_KEYCLOAK_1",
    "expires_in": 300,
    "refresh_expires_in": 1800,
    "refresh_token": "TOKEN",
    "token_type": "Bearer",
    "not-before-policy": 0,
    "session_state": "c63db133-d61c-426d-b0fe-902fb1b019c1",
    "scope": "profile email"
}

字符串
之后,我想使用之前Keycloak_1收到的token(TOKEN_KEYCLOAK_1),向Keycloak_2发出类似的POST请求,并接收一个AuthZ token(TOKEN_KEYCLOAK_2)。如果用户是可信的,TOKEN_KEYCLOAK_2将被给予API GW以获取所需的资源,如下所示:

curl --location 'http://API_GW/test1' \
--header 'Authorization: Bearer TOKEN_KEYCLOAK_2'


需要指出的是,在Keycloak_1中进行身份验证的用户可以从Keycloak_2中识别(参见下图),但他们没有注册到Keycloak_2(如果我尝试在不使用Keycloak_1登录的情况下登录,我将无法进入)。

我的问题是,如果有可能完成这个操作流程,如果我做错了什么,或者如果流程缺少一些步骤。

iezvtpos

iezvtpos1#

这是一个非常标准的设置,尽管代理被称为授权服务器(AS)。它的工作方式是您的应用程序和API只与AS交互:

  • 客户端针对AS运行代码流
  • AS针对IDP运行另一个代码流
  • IDP向AS发放令牌
  • AS向客户端发出令牌
  • 客户端向REST API发送访问令牌
  • REST API从AS下载令牌签名公钥,验证访问令牌

一个关键点是客户端和API从不与IDP交互,另一个关键点是你不能用密码流来做这件事,密码流不应该使用。
这听起来可能很复杂,但它只是一个部署和配置工作。你写的代码会很小。我的blog post展示了如何将这种类型的设置放在一起。你需要将其转换为Keycloak:

  • IDP在AS中配置为OpenID Connect身份验证方法
  • AS配置为IDP的客户端

相关问题