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
- 点击保存,并且点击 Test Configuration 测试是否能成功登录。
- 如果成功,前往 Attribute Mapping,将 Username 改为 preferred_username
点击下方的保存设置,配置已完成。
这时候在登陆界面点击 Login With customApp 即可跳转 Keycloak 进行认证并登录,需要注意 WordPress 在遇到全新用户名的时候可能会创建新账户(由于插件原因)
配置Dokuwiki
安装 oAuth Plugin插件目前有问题,已经有新的提交(但是仍未合并),在合并之前请使用 https://github.com/cosmocode/dokuwiki-plugin-oauth/pull/93- 前往配置界面,修改Oauth的配置
- 按照以下图片填写(
配置完成后,登陆界面会出现 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;
发表回复