You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为Ambassador OAuth2 Filter配置Keycloak登出后的重定向URL?

解决Ambassador OAuth2 Filter对接Keycloak登出后跳转登录页的问题

我之前在对接Ambassador和Keycloak做OAuth2授权的时候,也碰到过登出后停在Keycloak空白页面的情况,给你几个可行的解决方案:

方法一:通过Ambassador登出端点传递重定向参数

Ambassador的OAuth2 Filter其实支持通过post_logout_redirect_uri查询参数指定登出后的跳转地址,你只需要在提交的表单URL里加上这个参数,同时确保Keycloak端允许这个重定向地址即可。

修改你的登出代码如下:

const realm = 'your-realm-name';
// 替换成你的实际登录页URL,注意要编码
const redirectUri = encodeURIComponent(window.location.origin + '/login');
const form = document.createElement('form');
form.method = 'post';
// 在URL中添加post_logout_redirect_uri参数
form.action = `/.ambassador/oauth2/logout?realm=${realm}&post_logout_redirect_uri=${redirectUri}`;
const xsrfInput = document.createElement('input');
xsrfInput.type = 'hidden';
xsrfInput.name = '_xsrf';
xsrfInput.value = getCookie(`ambassador_xsrf.${realm}`);
form.appendChild(xsrfInput);
document.body.appendChild(form);
form.submit();

对应的Keycloak配置步骤:

  1. 登录Keycloak控制台,进入你的Realm和对应的客户端
  2. 找到Valid Post Logout Redirect URIs配置项
  3. 把你刚才指定的登录页URL(比如http://your-domain/login)添加进去,多个地址可以用换行或逗号分隔
  4. 保存配置

这样Ambassador会把post_logout_redirect_uri参数传递给Keycloak,登出成功后就会自动跳转到你的登录页了。

方法二:直接调用Keycloak的登出端点(当Ambassador不支持参数传递时)

如果你的Ambassador版本较旧,不支持传递post_logout_redirect_uri参数,可以绕过Ambassador,直接向Keycloak的OpenID Connect登出端点提交请求。这种方式需要你获取到用户的id_token_hint(可以从Ambassador设置的cookie中获取)和客户端ID。

示例代码:

const realm = 'your-realm-name';
const clientId = 'your-client-id'; // Keycloak客户端的ID
const keycloakLogoutUrl = `https://your-keycloak-domain/realms/${realm}/protocol/openid-connect/logout`;
const redirectUri = encodeURIComponent(window.location.origin + '/login');

// 从Ambassador的cookie中获取id_token,cookie名格式通常是ambassador_id_token.{realm}
const idTokenHint = getCookie(`ambassador_id_token.${realm}`);

const form = document.createElement('form');
form.method = 'post';
form.action = keycloakLogoutUrl;

// 添加Keycloak登出所需的参数
const params = [
  { name: 'id_token_hint', value: idTokenHint },
  { name: 'post_logout_redirect_uri', value: redirectUri },
  { name: 'client_id', value: clientId }
];

params.forEach(param => {
  const input = document.createElement('input');
  input.type = 'hidden';
  input.name = param.name;
  input.value = param.value;
  form.appendChild(input);
});

document.body.appendChild(form);
form.submit();

同样,你需要确保Keycloak客户端的Valid Post Logout Redirect URIs已经包含了你的登录页URL。

关键注意事项

  • 确认Ambassador OAuth2 Filter的版本:较新版本的Ambassador才支持传递post_logout_redirect_uri参数,如果是旧版本建议升级
  • Keycloak的重定向URL必须完全匹配:包括协议(http/https)、域名、路径,不能有多余的斜杠或参数
  • 检查cookie的获取逻辑:确保getCookie函数能正确获取到Ambassador设置的ambassador_xsrf.{realm}ambassador_id_token.{realm} cookie

内容的提问来源于stack exchange,提问作者Christoph Krieger

火山引擎 最新活动