我开始告诉我不是这个领域的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登录的情况下登录,我将无法进入)。
我的问题是,如果有可能完成这个操作流程,如果我做错了什么,或者如果流程缺少一些步骤。
1条答案
按热度按时间iezvtpos1#
这是一个非常标准的设置,尽管代理被称为授权服务器(AS)。它的工作方式是您的应用程序和API只与AS交互:
一个关键点是客户端和API从不与IDP交互,另一个关键点是你不能用密码流来做这件事,密码流不应该使用。
这听起来可能很复杂,但它只是一个部署和配置工作。你写的代码会很小。我的blog post展示了如何将这种类型的设置放在一起。你需要将其转换为Keycloak: