问题标签 [token-exchange]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2632 浏览

cookies - 通过访问或 id 令牌/令牌交换建立 SSO/设置 cookie

我允许登录外部应用程序的用户通过 Keycloak 的身份代理和外部到内部令牌交换使用他们的访问令牌跳转到我们的应用程序。

现在我想在我们的应用程序的嵌入式 JxBrowser 中建立一个 SSO 会话,类似于常规浏览器登录流程,其中在浏览器中设置了三个 cookie:AUTH_SESSION、KEYCLOAK_SESSION(_LEGACY) 和 KEYCLOAK_IDENTITY(_LEGACY)。

KEYCLOAK_IDENTITY 包含一个Serialized-ID类似于 ID 令牌的类型的令牌。

是否可以使用交换的(内部)访问和/或 ID 令牌创建 KEYCLOAK_IDENTITY cookie,并且如果其他两个 cookie 也正确创建,这是否会建立有效的 SSO 会话?

基本上我所缺少的是如何获取或创建Serialized-ID类型令牌。

0 投票
1 回答
1959 浏览

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

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

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

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

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

0 投票
1 回答
594 浏览

keycloak - 如何更改通过 Keycloak 令牌交换创建的访问令牌的内容

我的目标是获得两个资源服务器特定的访问令牌,其中仅包含特定于相应资源服务器的数据。

我有以下设置:一个公共客户端正在使用 2 个资源服务器。

在配置客户端用户领域角色客户端范围并使用范围参数后,我可以创建 2 个不同的资源服务器特定访问令牌:

在登录过程中,我将scope参数设置为client_scope_fitness_resource_server_1_roles并获取第一个资源服务器 1 特定的访问令牌。由于我在登录过程中只获得一个访问令牌并且我的客户端是公共的,因此我想使用资源服务器 1 通过使用 Keycloak 的内部令牌到内部令牌令牌交换功能来获取第二个 - 资源服务器 2 特定的访问令牌。我按照说明进行操作,并且可以通过此调用获得第二个令牌:

但是,如果我查看第二个令牌的内部,它包含我想要的更多信息:

我的问题是,如何配置 Keycloak 以使第二个访问令牌不包含角色“offline_access”和“uma_authorization”以及 aud:“other_resource_server”、“fitness-client”、“other_client”、“account”?

0 投票
0 回答
1512 浏览

single-sign-on - 跨领域的 Keycloak 令牌交换

我们使用 Keycloak 12.02 进行此测试。

这个想法是我们有很多客户,我们都有自己的领域。我们希望能够为主领域中的管理员/支持用户模拟任何非主领域中的用户。

流程将是:

  1. 使用超级用户/密码登录以登录master领域
  2. 获取所有可用领域及其用户的列表
  3. 为该特定用户制作一个将当前访问令牌与新访问令牌交换的请求。

这是我无法开始工作的最后一步。

例子:

登录到主域

(我们现在在主领域有一个超级用户的访问令牌)

Keycloak 服务器已启用令牌交换 (-Dkeycloak.profile.feature.token_exchange=enabled),如此处所述https://www.keycloak.org/docs/latest/securing_apps/#_token-exchange

尝试在另一个领域(不是主人)模拟用户:

但是,这不起作用。结果是:{"error":"invalid_token","error_description":"Invalid token"}

(在单个领域工作中执行此操作)

我在这里做错了什么?这似乎是在实际部署中使用的一个非常正常的功能,因此非常感谢任何帮助!

更新:首先,我在这里找到了相同的用例:https ://lists.jboss.org/pipermail/keycloak-user/2019-March/017483.html

此外,我可以通过一些主要的箍来让它工作。如上所述,可以将领域中的broker客户端master用作身份提供者:

  • 以超级用户身份登录adminA->TokenA
  • 用于从身份提供者TokenA获取新的外部令牌。TokenExtmaster
  • 用于TokenExt为您要模拟的用户进行令牌交换

上面的警告是,用户adminA是在您使用此方法登录的每个领域中创建的,因此仍然不理想。

0 投票
1 回答
60 浏览

oauth-2.0 - 系统上下文中令牌交换后“行为”声明的形状

我目前正在实施 OAuth 令牌交换 STS,并且有点挣扎。该标准在https://www.rfc-editor.org/rfc/rfc8693中定义 我的用例涉及由用户(主体)操作触发的系统到系统调用链。我想确保端点级别的授权是由范围和白名单 client_ids 的混合完成的。此外,我想保留客户上下文。

我看到令牌交换方案在这里是有效的。规范给出了一个示例,其中生成的令牌包含被授权访问的参与者。但是,规范将逻辑系统(又名 OAuth 客户端)放入嵌套参与者信息的“子”声明中,如下所示:

我觉得这有点奇怪。如果演员令牌也是个性化令牌(例如“adminuser”),我希望“sub”声明带有实际主题。在我看来,进行令牌交换的系统会将 client_credentials 令牌作为参与者令牌发送。这不包含“sub”声明,而仅包含“cid”(client_id)声明。此声明应包含在生成的令牌的“行为”声明中,因此我希望生成的令牌如下所示:

我不确定“行为”声明是否有必要的结构(据我所知,没有)。这里有最佳实践吗?好奇你的想法!:)

0 投票
0 回答
250 浏览

keycloak - Keycloak 跨域代币兑换

我是 keycloak 的新手,我一直在努力解决如何发起令牌交换请求。

我在领域 A 中配置了一个 OpenID 客户端 A。我的要求是交换我从客户端 A 收到的令牌,以从在领域 B 中配置的客户端 B 获取令牌。

我正在尝试外部到内部令牌交换的示例。我已经将客户端 A 配置为领域 B 中的 oidc 并执行以下 cURL:

提前致谢

0 投票
0 回答
46 浏览

keycloak - 将 Keycloak 令牌交换限制为特定客户端

我在 Keycloakclient1-webclient2-server. client1-web是公开的,client2-server保密的。

这是我目前拥有并且工作正常的流程:

  1. 用户通过 webapp 登录到client1-web
  2. 使用身份验证令牌调用 API 服务器client1-web进行身份验证
  3. API 服务器调用 Keycloakclient2-server为不同的用户交换令牌
  4. Token交换成功,从API服务器返回给webapp

我已经按照文档配置了 Keycloak 。在夏天:

  • 启用细粒度权限
  • 客户 > client1-web> 权限 > 令牌交换
  • 添加策略
    • 客户->client2-server
    • 策略 -> 一致

我的理解是,这应该只允许客户端上的令牌交换,为client2-server客户端铸造令牌client1-web

问题:

虽然我可以在 上进行令牌交换client2-server,并为模拟用户取回令牌,但我也可以直接进行令牌交换,client1-web这会带来真正的安全风险。

期望的结果:

只能client2-server做代币兑换,不能client1-web

0 投票
1 回答
119 浏览

android - 令牌交换 - Android + Google + Keycloak

语境:

我正在开发一个原生 Android 应用程序,使用 Google SignIn 对其进行身份验证并且它正在运行。

我还有一个 Keycloak 服务器作为身份提供者与谷歌集成,它也可以工作。

首次登录时,我可以使用访问 http://localhost:8080/auth/realms/chapa/account/ 的网络浏览器从 Google 导入我的帐户。

当我进入 Keycloak 控制台时,我发现我的帐户已创建并与 Google 相关联。

我的 Google 身份提供程序设置是使用 (OpenId Connect v1 + https://accounts.google.com/.well-known/openid-configuration ) 或 Keycloak 上的 Social Google 完成的。

这两种方式都可以使用浏览器导航,因为我看到很少有人抱怨 Keycloak 插件坏了。

我的问题:

在我的 Android 应用程序上,我无法使用 Keycloak 服务器执行令牌交换。

我做了一项研究,这是集成 Android + Google + Keycloak 的唯一方法,因为我不想再次询问我的用户凭据。如果您知道其他方法,请告诉我。

在我的 Keycloak 服务器上,我得到的不是这个警告:

08:09:48,831 WARN [org.keycloak.events](默认任务 11)类型=TOKEN_EXCHANGE_ERROR,realmId=my-realm,clientId=android-app,userId=null,ipAddress=172.17.0.1,error=invalid_token,原因='用户信息调用失败', auth_method=token_exchange, grant_type=urn:ietf:params:oauth:grant-type:token-exchange, subject_issuer=https://accounts.google.com, validation_method='用户信息', client_auth_method =客户机密

这是我在 Postman 上手动对 Keycloak 执行的请求,期望交换令牌:

邮递员响应(400 错误请求):

安卓代码:

0 投票
1 回答
135 浏览

java - Spring OAuth2 客户端凭据流中的令牌交换

我有以下 Spring Security 配置:

并使用以下配置:

现在我需要进行模拟(https://datatracker.ietf.org/doc/html/rfc8693)。所以我需要假装成某个用户。由于某些应用程序应用程序中的“当前用户”逻辑,我需要它。

我怎样才能重新配置来实现它?

PS我试图谷歌它,但我没有找到任何相关的东西。