Keycloak 使用不同的客户端重新验证经过身份验证的用户

     2023-02-19     160

关键词:

【中文标题】Keycloak 使用不同的客户端重新验证经过身份验证的用户【英文标题】:Keycloak reauthenticate an Authenticated user with a different client 【发布时间】:2021-01-04 23:37:21 【问题描述】:

如果我有一个用户在领域 R 下使用公共客户端 C1 使用 keycloak 进行身份验证,我是否可以在 keycloak 中点击一个端点,该端点将为同一领域 R 下的不同公共客户端 C2 生成新的访问令牌?

[更新 #1] 我尝试使用刷新令牌为 C2 客户端获取新的访问令牌,但出现以下错误:

Invalid refresh token. Token client and authorized client don't match

[更新 #2] 所以,上面给了我尝试使用交换令牌授权类型的想法,我现在可以使用它了。

curl --request POST \
  'https://myhost.com.au/auth/realms/<my realm>/protocol/openid-connect/token' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
  --data-urlencode 'subject_token=<c1 access token>' \
  --data-urlencode 'subject_token_type=urn:ietf:params:oauth:token-type:access_token' \
  --data-urlencode 'requested_token_type=urn:ietf:params:oauth:token-type:refresh_token' \
  --data-urlencode 'client_id=<c2 client id>'

【问题讨论】:

如果它们在同一领域下,为什么要生成新的访问令牌? @ravthiru 将新客户端的范围/声明获取到访问令牌中。 @ravthiru 他的问题完全有道理:请参阅keycloak.org/docs/latest/server_admin/#_role_scope_mappings 领域角色不一定暴露在所有客户端的访问令牌中。 【参考方案1】:

你的问题很有道理。不幸的是,角色范围映射文档对于如何在切换到不同的客户端时生成新的访问令牌是难以捉摸的。

有一个Oauth2 RFC about token exchange。从Keycloak 11.0.2 token exchange is documented as a technology preview 开始,必须使用-Dkeycloak.profile.feature.token_exchange=enabled 启用

您可以通过这种方式交换代币(实际上取自问题):

Method: POST
URL: https://<keycloak.host>/auth/realms/myrealm/protocol/openid-connect/token
Body type: x-www-form-urlencoded
Form fields:    
. grant_type: urn:ietf:params:oauth:grant-type:token-exchange
. subject_token: <C1-access-token> 
. subject_token_type: urn:ietf:params:oauth:token-type:access_token
. requested_token_type=urn:ietf:params:oauth:token-type:refresh_token
. client_id: <C2-client-id>

这是来自"role scope mapping" documentation 的一些上下文,供其他读者阅读。

当创建 OIDC 访问令牌或 SAML 断言时,所有用户 默认情况下,用户的角色映射作为声明添加到 令牌或断言。 [...] 访问令牌经过数字签名,可以 实际上被应用程序重新使用以远程调用其他 安全的 REST 服务。这意味着如果应用程序获得 受到威胁或在该领域注册了流氓客户端, 攻击者可以获得具有广泛权限的访问令牌 并且您的整个网络都受到了威胁。这是角色范围 映射变得很重要。

角色范围映射是一种限制声明的角色的方法 在访问令牌内。当客户端请求用户 经过身份验证,他们收到的访问令牌将仅包含 您为客户端范围明确指定的角色映射。

[...] 要更改此默认行为,您必须明确关闭 Full Scope Allowed 开关并声明您想要的特定角色 在每个单独的客户中。或者,您也可以使用客户端 范围为一整套定义相同的角色范围映射 客户。

【讨论】:

@ShaneRowatt 好的,感谢您告诉我。我用您的解决方案更新了我的答案,并为未来的读者提供了额外的参考。

使用有效的 JWT 令牌调用经过 keycloak 身份验证的 API

】使用有效的JWT令牌调用经过keycloak身份验证的API【英文标题】:CallkeycloakauthenticatedAPIwithvalidJWTtoken【发布时间】:2020-07-2206:06:57【问题描述】:我创建了一个简单的SpringBoot应用程序,我已使用keycloak对其进行了身份验证。当我... 查看详情

无需重定向到 Keycloak 的客户端身份验证

】无需重定向到Keycloak的客户端身份验证【英文标题】:ClientsideauthenticationwithoutredirectiontoKeycloak【发布时间】:2019-11-0612:24:39【问题描述】:很简单的问题,花很多时间搜索。带有SpringSecurity的SpringBoot1.4.x应用程序尝试使用Keycloa... 查看详情

在keycloak中如何更改经过身份验证的用户的密码

】在keycloak中如何更改经过身份验证的用户的密码【英文标题】:inkeycloakhowtochangethepasswordofanauthenticateduser【发布时间】:2021-07-0806:59:49【问题描述】:在keycloak管理中,如果我将用户的“必需的用户操作”设置为“更新密码”。... 查看详情

使用 Keycloak 进行微服务身份验证

...务请求,但我找不到任何示例来说明如何在keycloak中配置客户端以及如何配置spring安全性。这是我要归档的架构:我已经设法让用户授权工作并保护微服务A,现在我正在尝试授权来自微服务B的请求,但我不知道该 查看详情

使用spring boot(安全)和keycloak启用角色身份验证?

...事情。想要向单个端点发出请求并发送不记名令牌(来自客户端),我希望验证此令牌并取决于在我的端点上的keycloak接受/拒绝请求上分配的角色。我学习了 查看详情

如何使用 Keycloak 和 PKCE 流实现 React SPA 身份验证?

...机器上准备了一个Keycloak实例,我可以在其中创建领域、客户端等。我找到了React+Keycloak的使用示例,但没有一个使用PK 查看详情

Keycloak CIBA 身份验证失败并显示“发送身份验证请求失败”

...k15.0.2上设置CIBA端点。我已经设置了一个启用了CIBA端点的客户端,但是当我使用如下所示的请求点击 查看详情

Keycloak KubeAPI 身份验证失败

...es集群,为此,如documents中所述,我正在使用PythonKuberentes客户端,它需要一个令牌才能与KubeAPI进行通信。当我尝试使用Kube登录在Kube-co 查看详情

无法使用 openid_client 通过带有 keycloak 的 pkce Flutter 应用程序进行身份验证

...布时间】:2021-12-2115:05:49【问题描述】:我有以下KeyCloak客户端配置,以使用pkce身份验证流程:Realm:REALMClientID:pkce-clientC 查看详情

KeyCloak 在身份验证代码流错误后重定向回身份提供者

...的身份验证和授权发生在自定义(默认)身份提供者中。客户端应用程序(通过用户)接收到授权 查看详情

使用 OIDC 身份代理的 Keycloak 2 因素身份验证

】使用OIDC身份代理的Keycloak2因素身份验证【英文标题】:Keycloak2-factorauthentificationwithOIDCIdentityBrokering【发布时间】:2021-09-0823:18:36【问题描述】:是否可以使用OIDC身份代理进行2因素身份验证我正在尝试使用TOTP设置2因素身份验... 查看详情

apache shiro:在 shiro.ini 中添加啥以使用 JWT 和 keycloak 作为授权服务器进行客户端身份验证

...在shiro.ini中添加啥以使用JWT和keycloak作为授权服务器进行客户端身份验证【英文标题】:apacheshiro:whattoaddinshiro.iniforclientauthenticationusingJWTwithkeycloakasauthorizationserverapacheshiro:在shiro.ini中添加什么以使用JWT和keycloak作为授权服务器进... 查看详情

如何在 Keycloak 中创建客户端以与 AWS Cognito 身份联合使用

】如何在Keycloak中创建客户端以与AWSCognito身份联合使用【英文标题】:HowtoCreateaClientinKeycloaktousewithAWSCognitoIdentityFederation【发布时间】:2018-09-2310:04:30【问题描述】:我有一个用户群,其身份和身份验证由keycloak管理。我希望允... 查看详情

与 Keycloak 身份验证插件集成时,无法从 rest 客户端调用 nuxeo rest api

】与Keycloak身份验证插件集成时,无法从rest客户端调用nuxeorestapi【英文标题】:UnabletocallnuxeorestapifromrestclientwhenintegratedwithKeycloakauthenticationplugin【发布时间】:2019-10-2716:17:17【问题描述】:我想将keycloak集成为在我的本地机器上... 查看详情

Keycloak Realm VS Keycloak 客户端

】KeycloakRealmVSKeycloak客户端【英文标题】:KeycloakRealmVSKeycloakClient【发布时间】:2019-10-2622:18:53【问题描述】:我最近正在开发用于SSO的Keycloak6.0.1,用于对组织中的多个应用程序进行身份验证。我对客户和领域之间的区别感到困... 查看详情

如何在 Spring Security 中将令牌转换为身份验证?

...13:51:27【问题描述】:我使用keycloak作为Idp。我使用keycloak客户端从keycloak获取jwt令牌。当我使用令牌调用由keycloak-spring-security-adapter和spring-secu 查看详情

使用 Keycloak 时的静默身份验证 CORS 问题

】使用Keycloak时的静默身份验证CORS问题【英文标题】:SilentauthenticationCORSproblemwhenusingKeycloak【发布时间】:2020-05-1020:46:05【问题描述】:我正在尝试使用以下调用在我的网站上执行静默身份验证:fetch(\'http://localhost:8100/auth/realms/... 查看详情

Keycloak:使用 nginx 后面的 javascript 适配器的重定向循环

...时间】:2019-06-1705:25:06【问题描述】:我有一个Javascript客户端使用OIDC对keycloak进行身份验证。身份验证在开发环境中工作正常,但在客户端和后端之间使用反向代理(包括keycloak)时以重 查看详情