# Keycloak SSO 和登出问题

**URL:** https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915
**Category:** SSO
**Created:** [2021年二月1日 06:00 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915 "2021-02-01T06:00:20Z")
**Posts on this page:** 14
**Page:** 1

<div class="post-metadata">

### Author: ![nahimov](https://avatars.discourse-cdn.com/v4/letter/n/aca169/32.png) [@nahimov](https://meta.discourse.org/u/nahimov)
#### Post date: [2021年二月1日 06:00 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/1 "2021-02-01T06:00:20Z")

</div>

你好！  
@david 请帮帮我，这位大好人！))))

我已经成功配置了 Discourse + Keycloak SSO + SAML 插件 + OpenID Connect 插件的组合。唯一美中不足的是登出功能。

当我从论坛登出时，用户会被取消授权，这部分工作正常。  
但查看 Keycloak 上的活跃会话时，发现该用户的会话并未被删除。  
我怀疑这与登出 URL 的设置有关，只是不确定是在 Discourse 还是 Keycloak 中配置。

我在 Keycloak 上的 SAML 设置如下：

 ![image](https://global.discourse-cdn.com/meta/original/3X/8/c/8c222023c2d703853842dbc785a872921a3f4787.png)

我在 Keycloak 上的 OpenID Connect 设置如下：

 ![image](https://global.discourse-cdn.com/meta/original/3X/1/f/1fe82f4c6bd0965f237224e92776faff4335d04d.png)

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2021年二月1日 09:37 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/2 "2021-02-01T09:37:11Z")

</div>

OpenID Connect 插件支持 [RP 发起的注销](https://openid.net/specs/openid-connect-rpinitiated-1_0.html)。Keybase 是否支持该功能？

---

<div class="post-metadata">

### Author: ![nahimov](https://avatars.discourse-cdn.com/v4/letter/n/aca169/32.png) [@nahimov](https://meta.discourse.org/u/nahimov)
#### Post date: [2021年二月1日 10:01 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/3 "2021-02-01T10:01:37Z")

</div>

现在需要弄清楚它是什么，以及 Keycloak 中是否包含它。  
openid-connect 插件中的这个选项在哪里配置？

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2021年二月1日 10:02 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/4 "2021-02-01T10:02:39Z")

</div>

它是在站点设置中配置的：

> [@david](#):
>
> - **`openid connect rp initiated logout`** ：注销后将用户重定向到 end\_session\_endpoint。您的身份提供商必须支持此功能，并将其包含在发现文档中。

---

<div class="post-metadata">

### Author: ![nahimov](https://avatars.discourse-cdn.com/v4/letter/n/aca169/32.png) [@nahimov](https://meta.discourse.org/u/nahimov)
#### Post date: [2021年二月1日 10:03 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/5 "2021-02-01T10:03:48Z")

</div>

谢谢！我会尝试用谷歌搜索 Keycloak 对此问题的解答。

---

<div class="post-metadata">

### Author: ![nahimov](https://avatars.discourse-cdn.com/v4/letter/n/aca169/32.png) [@nahimov](https://meta.discourse.org/u/nahimov)
#### Post date: [2021年二月2日 07:55 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/6 "2021-02-02T07:55:40Z")

</div>

> [@david](#):
>
> OpenID Connect 插件支持 [RP 发起的注销](https://openid.net/specs/openid-connect-rpinitiated-1_0.html)。Keybase 是否支持该功能？

是的！它运行正常！我想澄清的是，必须设置 **openid\_connect\_rp\_initiated\_logout\_redirect** 变量。

@david 我还有一个问题，一个很重要的问题。  
目前我正处于 Keycloak SSO 测试的最后阶段，需要在 **SAML** 和 **OpenID Connect** 之间选择一个协议。  
我更喜欢 **OpenID Connect** ，但目前在使用 **OpenID Connect** 创建新用户时发现了一个令人烦恼的问题。

为了说明这个问题，我先从另一端说起。当使用 **SAML** 创建新的论坛用户时，用户会在 SSO 中创建，并透明地提交给 Discourse 进行创建。而且用户会立即被激活——这一点非常重要！  
也就是说，当我在 Discourse 论坛上点击“ **注册** ”时，我会跳转到 Keycloak，在那里创建用户、确认邮箱等。之后，我会被重定向回 Discourse 论坛，此时用户已经创建完成并且 **已激活** ，自动完成：

 ![CUBA.Platform 2021-02-02 11-40-39](https://global.discourse-cdn.com/meta/original/3X/4/d/4d345919ce29605a6a603d798d8a6d2c68cf41f4.png)

但如果我使用 **OpenID Connect** 插件，那么在创建新用户时，会出现以下窗口：

 ![CUBA.Platform 2021-02-02 11-35-53](https://global.discourse-cdn.com/meta/original/3X/6/b/6b848f5fb5d21ec786e7cc7feb938d7bd02d9fcf.png)

这非常不方便！这是为了什么？毕竟用户在 SSO 上创建账户时已经确认了邮箱。有没有办法摆脱这个窗口？

提前非常感谢！

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2021年二月2日 09:44 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/7 "2021-02-02T09:44:20Z")

</div>

> [@nahimov](#):
>
> 毕竟，在 SSO 创建账户时，用户的邮箱已经得到确认了。

如果该消息出现在 OpenID Connect 中，则意味着身份提供商向 Discourse 传递了 `email_verified: false` 的消息。如果您启用详细调试设置，它将把所有认证数据打印到 `/logs` 供您检查。希望有一种方法可以告诉 Keycloak 正确传递验证状态。

---

<div class="post-metadata">

### Author: ![nahimov](https://avatars.discourse-cdn.com/v4/letter/n/aca169/32.png) [@nahimov](https://meta.discourse.org/u/nahimov)
#### Post date: [2021年二月2日 09:46 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/8 "2021-02-02T09:46:05Z")

</div>

> [@david](#):
>
> 如果该消息显示在 OpenID Connect 中，则意味着身份提供商向 Discourse 传递了 `email_verified: false` 的消息。如果您启用详细调试设置，它会将所有认证数据打印到 `/logs` 供您检查。希望有一种方法可以告诉 Keycloak 正确传递验证状态。

那么，为什么 SAML 插件会忽略这一点呢？

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2021年二月2日 09:47 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/9 "2021-02-02T09:47:17Z")

</div>

在 SAML 插件中，这由全局设置 `saml_default_emails_valid` 控制（默认为 true）。

---

<div class="post-metadata">

### Author: ![nahimov](https://avatars.discourse-cdn.com/v4/letter/n/aca169/32.png) [@nahimov](https://meta.discourse.org/u/nahimov)
#### Post date: [2021年二月2日 10:03 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/10 "2021-02-02T10:03:32Z")

</div>

我找到解决方案了！))))  
在 Keycloak 中：

 ![image](https://global.discourse-cdn.com/meta/original/3X/c/1/c1835bc216b3d7b0103ad1a53724e403a71fea55.png)

 ![image](https://global.discourse-cdn.com/meta/original/3X/0/2/02bf1de4f7e8d87f82111cc843e6e1bcab5058df.png)

禁用这些选项：

 ![image](https://global.discourse-cdn.com/meta/original/3X/e/7/e7e2f5b2027d97d058efb8c90f98f88c06603319.png)

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2021年二月2日 10:20 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/11 "2021-02-02T10:20:07Z")

</div>

只要您 100% 确定 Keycloak 已验证过邮箱，那就没问题。如果邮箱未经过验证，这样做会让您的 Discourse 站点面临攻击风险。

---

<div class="post-metadata">

### Author: ![nahimov](https://avatars.discourse-cdn.com/v4/letter/n/aca169/32.png) [@nahimov](https://meta.discourse.org/u/nahimov)
#### Post date: [2021年二月2日 10:53 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/12 "2021-02-02T10:53:06Z")

</div>

是的，没错……  
现在测试新场景——两个论坛共用一个 Keycloak OpenID 客户端 ))

---

<div class="post-metadata">

### Author: ![nahimov](https://avatars.discourse-cdn.com/v4/letter/n/aca169/32.png) [@nahimov](https://meta.discourse.org/u/nahimov)
#### Post date: [2021年二月2日 11:08 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/13 "2021-02-02T11:08:22Z")

</div>

顺便问一下，@david，你觉得哪种做法更正确：

1. 为所有论坛使用一个 OpenID 客户端，并指定所需的“有效重定向 URL"，就像我现在这样：  
 ![image](https://global.discourse-cdn.com/meta/original/3X/7/d/7d33a42393d543a921483789fafd6cc1d8fe8173.png)  
 ![image](https://global.discourse-cdn.com/meta/original/3X/1/b/1b4cf0313cdd5ceaedb145196b4abdca4ef36e62.png)
2. 还是为每个论坛使用独立的 OpenID 客户端？

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2021年二月2日 11:15 UTC](https://meta.discourse.org/t/keycloak-sso-and-logout-issue/177915/14 "2021-02-02T11:15:58Z")

</div>

我不太熟悉 Keycloak，但这两种方案听起来都可行。如果你之后想为每个论坛设置独立的访问控制，将它们作为独立的客户端可能会更方便 🤷‍♂️
