Herry001
Nothing lasts forever.
Herry的平行世界

配置个人的 SSO 单点登录服务

2022年9月更新:

Keycloak 已经不再使用 WildFly,这篇文章中的“安装 Keycloak”部分已经不再适用。与之前相比,新版本所使用的 Quarkus 配置难度更低,建议直接参考官方配置文档配置。

新版本的UI界面有较大更新,请自行比对参考。

新版本中,/auth 已经从默认的上下文路径中删除,下文中的链接请自行修改。

Introduction

由于个人习惯,网盘,知识库,Jenkins,Git 服务器啥的都是自己搭建自己用,而某些服务的使用频率实在是太低了……低到我几乎每次使用都要重置下密码(

因此就一直在考虑搭建自己的统一认证服务……

既然是给自己用的,那必然是越简单越好,也就是说:

  • 无高并发需求
  • 最好别用外部数据库(没必要
  • 只用一个实例实现(穷,只有一台机器)

最后选择了 Keycloak 用来搭建个人单点登录服务。

为啥是 Keycloak?

其实是考虑过用其他服务搭建单点登录的,然而……

  • Apereo CAS 的安装文档我没看懂(不会 WAR Overlay method),以及对个人来说貌似过于复杂了
  • Shibboleth IdP 同上,甚至更加复杂
  • 使用 Github/Microsoft 等提供的社交登录我需要创建一大堆 Oauth APP(域名不同

而相比之下,Keycloak能够满足我的绝大多数需求:

  • 支持社交登录(套娃开始
  • 能用的 Web UI
  • 自带数据库(虽然不建议用,但应付我这种个人认证大概没问题
  • Oauth2 以及 saml 支持

目前的我自建的服务大多都支持 Oauth2 或者 saml,不支持的产品可以通过 oauth2-proxy 解决,基本上能满足个人需要。

安装 Keycloak

keycloak 的安装过程并不难,可以参考这篇文章以及官方文档

如果遵循的是第一篇文章,请根据自己的需求选择是否配置最后一部分的管理界面 (Configure Keycloak Management Console)以及是否配置外部数据库

创建一个新域 (Add Realm)

使用 Master 域是很愚蠢的行为……所以还是单独开一个吧(点击 Add realm 添加新域

起一个正常的名字即可(

如果有需求,可以修改 Display name 和 HTML Display name 达到自定义显示的效果。

在 Login 选项中的个人配置如下:

  • 关闭忘记密码
  • 打开验证邮箱
  • 打开使用邮箱登录

修改 Security Defenses:

  • 打开Brute Force Detection防止被爆破
  • 关闭Permanent Lockout
  • 设置以下数据:
  • Max Login Failures
  • Minimum Quick Login Wait
  • Max Wait
  • Failure Reset Time

前往 Authentication 中 Flows,下拉栏选 First Broker Login,将以下两个流程改为 Disabled,以防止可能出现的通过第三方账号注册:

  • Create User If Unique
  • Confirm Link Existing Account

至此,Keycloak 部分基本配置完毕。接下来要去配置更麻烦的客户端啦

创建OpenID客户端(Client)

理论上这部分的配置应该根据客户端本身来修改,在此只能保证此部分的步骤适用于大多数客户端(比如后面的 WordPress 和 Dokuwiki)

前往配置中的 Clients 界面,点击 Create 创建一个新的客户端

  • 想一个好记的客户端的 ID(比如说 herry_wordpress )后点击Save即可。(建议全小写以防止可能出现的问题)
  • 修改 Access Type 为 confidential
  • 下方的 Valid Redirect URIs 填入客户端 Web 地址+ *,比如本博客就是https://blog.herry001.com/*

点击保存(Save)。

接下来前往 Credentials,复制下 Secret。(可以之后再复制

至此一般的客户端配置已完成。

配置Wordpress

  • 安装插件 OAuth Single Sign On – SSO (OAuth Client)
  • 吐槽:这个插件略坑(但是貌似没有替代品……有好的替代品麻烦告诉我一声.jpg
  • 安装完毕后再左侧侧边栏应该能看见 miniOrange OAuth 的选项
  • 点击 Configure OAuth 界面中右上角的 Add Application
  • 把 Keycloak 中配置客户端时候创建的客户端 ID (比如 herry_wordpress)和 Credentials 中的 Secret 填写到此界面中的 Client ID 和 Client Secret 中。
  • 打开浏览器,查看这个界面:https://<你的Keycloak的服务器地址>/auth/realms/<您的域名称>/.well-known/uma2-configuration
  • 找到 web 中的 authorization_endpoint 和 token_endpoint,把这两个值填写到 Authorize Endpoint 和 Access Token Endpoint 里面。
  • 勾选 Show on login page
把example1和example2改了就行
  • 点击保存,并且点击 Test Configuration 测试是否能成功登录。
  • 如果成功,前往 Attribute Mapping,将 Username 改为 preferred_username

点击下方的保存设置,配置已完成。

这时候在登陆界面点击 Login With customApp 即可跳转 Keycloak 进行认证并登录,需要注意 WordPress 在遇到全新用户名的时候可能会创建新账户(由于插件原因)

配置Dokuwiki

配置完成后,登陆界面会出现 Login with other Services: Keycloak 的选项,选择即可。

配置Nginx + Oauth2-Proxy

这货巨坑(

首先,检查设备上的 Nginx,确保安装了 auth_request 模块,如果没有请先安装。

如果是宝塔面板,可以参考这篇文章(正在编辑,稍后放出)请自行修改编译脚本,具体自行上网搜索。

Oauth2-Proxy 的文档实际上是很详细的,因此具体的安装方法不再赘述,查看文档也许更加明智。

在此处只讲一个坑:Oauth2-proxy 中的 Provider 不要设置为 keycloak,至少在现在(版本6.0.0)我的设备上无法工作。我目前使用的方法是使用 oidc 作为 provider,填写时要求的oidc_issuer_url按照如下填写,client_url 和 client_secret 填写为 Keycloak 的客户端 ID 以及 Secret 即可。

https://<域名>/auth/realms/<域>

如果 Nginx 返回 500 错误,有可能是配置的问题,尝试将以下配置加入nginx.conf

proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
如无特殊声明,本站所有内容均在 CC-BY-NC 4.0 许可下发布

发表回复

textsms
account_circle
email

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Herry的平行世界

配置个人的 SSO 单点登录服务
由于个人习惯,网盘,知识库,Jenkins,Git 服务器啥的都是自己搭建自己用,而某些服务的使用频率实在是太低了……低到我几乎每次使用都要重置下密码,因此就一直在考虑搭建自己的统一认证服务……
扫描二维码继续阅读
2020-08-16