Skip to content

Jeff-Tian/keycloak-services-social-weixin

 
 

Repository files navigation

keycloak-services-social-weixin

🇺🇸 English | 🇨🇳 简体中文

Keycloak 的微信登录插件,尝试在 Keycloak 里打通整个微信生态。相关文章:《对接微信登录的三种方式 - Jeff Tian的文章 - 知乎

Java CI with Maven Maven Package

在线体验

如何使用

本项目是一个 Keycloak 的插件,所以你需要先有一个 Keycloak 实例,然后把本项目打包成 jar 包,放到 Keycloak 的 providers 目录下,然后重启 Keycloak 即可。即:

  • Add the jar to the Keycloak server:

    • cp target/keycloak-services-social-weixin-*.jar _KEYCLOAK_HOME_/providers/
  • 在生产环境下的keycloak,需要执行kc.sh build 注册provider

👨‍💻 本地开发

需要 JDK 17 或者以上。

mvn install

::: tip

如果在本地碰到比如编译出错等问题,最简单的办法就是使用 GitHub CodeSpace,绕过环境问题。

以上就是我在 CodeSpace 里开发本项目的截图,其开发容器配置在这里

:::

如何调试?

我一般都是通过添加日志,然后重启 Keycloak 服务,然后查看日志来排查问题。

原因是这并不是一个独立的程序,无法通过 IDE 直接运行或者调试(找不到 Main class)。它是嵌入在 Keycloak 里,通过 Keycloak 的 SPI 机制来运行的。我一般都是通过 Docker 方式启动 Keycloak 或者直接将该包加载到服务器上的 Keycloak 实例,然后观察本地或者服务器端的日志输出来排查问题的。

如果有人知道如何在 IDE 中本地调试 Keycloak 的 SPI 插件,欢迎提供帮助!

跑测试

mvn clean test

Maven 包

我本是一名 JavaScript 程序员,使用 NodeJs 两年之后,就在 npm 上发布了 20 多个包。当开始折腾 Java 之后,也想在 Maven Central 中发布包,但折腾了很久之后,我放弃了——没想到这么复杂!发布到 Maven Central 的好处是可以方便其他项目在 pom.xml 中引用此包,所以还是有价值的,如果有谁知道怎么发布到 Maven Central,请提供帮助

你也可以直接 fork 本仓库,并将它发布到 Maven Central,善莫大焉。

目前我在 GitHub 上发布了,在 GitHub 发布后,如果要在 pom.xml 中引用,不仅需要在 pom.xml 中配置 GitHub Packages 的仓库地址,还需要一个访问令牌,有一些麻烦。

当然,你也可以直接下载 jar 包:

获取 jar 包

直接下载

你可以从 https://github.com/Jeff-Tian/keycloak-services-social-weixin/packages 获取已经打好的 jar 包,可以省去打包的步骤。

手动打包

如果需要自己手动打包,可以在本地命令行执行:

mvn package
ls target

自动打包

本项目使用 GitHub Actions 自动打包,只需要在 master 分支上提交代码,即可自动打包。但是注意,需要修改 pom.xml 中的版本号,否则打包出来的 jar 包版本号和已经打好的 jar 包版本号冲突,从而不能上传到 GitHub Packages。

发版

本项目使用 GitHub Actions 自动发版,只需要在 master 分支上打一个 tag,然后在 GitHub 上发布一个 release 即可。不过,一般来说,也不需要手动打 tag。每次提交代码到 master 分支,GitHub Actions 都会检测是否有版本号的变化。如果版本号发生了变化,就会自动将该版本号做为新的 tag,并基于此来发布一个 release。详见: 这个 yml 文件

版本更新

当需要更新本项目的版本时,需要修改 pom.xml 中的版本号。或者使用如下命令,比如将版本号改为 0.5.14:

mvn versions:set -DnewVersion=0.5.14

配置截图

Keycloak 16

image

Keycloak 22

Client ID 和 公众号 App Id;Client Secret 和 公众号 App Secret 都可以是一样的,即通过手机或者 PC 的微信登录时,都使用同一个公众号。但是以上截图用了两个不同的,其中公众号 App Id 使用了我的个人测试公众号,在关注人数在 100 以内时可以使用。而手机端,则必须使用经过认证的企业公众号(特别感谢知友 hhhnnn 帮我提供,没有该服务号我没法调通手机端)。

Docker 镜像

我也打包了一个包含微信 idp 的 keycloak server docker 镜像

docker pull jefftian/keycloak-heroku:latest

一键部署

部署到 Heroku

点击这个按钮,可以部署一个包含微信登录的 Keycloak 到你自己的 Heroku:

Deploy to Heroku

::: warning 注意 Heroku 不再提供免费的 Dyno,部署到 Heroku 可能会产生费用。

:::

部署到 Okteto

【免费架构】Heroku 不免费了,何去何从之 Keycloak 的容器化部署之路 - Jeff Tian的文章 - 知乎

谁在使用

URL 说明 源码
https://keycloak.jiwai.win 我部署在 heroku 上的 Keycloak 实例 https://github.com/jeff-tian/keycloak-heroku
https://www.da-yi-jia.com 感谢答疑家对本项目的大力支持!

💵 欢迎问我!

有任何相关问题,欢迎来知乎咨询:

向我咨询

Release Notes

Star History

感谢大家的支持!

Star History Chart

致谢

  • 感谢 jyqq163/keycloak-services-social-weixin 提供的基础代码,本仓库从该仓库 fork 而来。
  • 感谢 hhhnnn 提供的企业公众号,没有该服务号我没法调通手机端。
  • 感谢各位发的 pull request 和 issue,让本项目越来越好!

原理

其实任何一个 OAuth2/OIDC 的登录插件都是一样的,都是通过一个授权链接,然后通过 code 换取 access_token,再通过 access_token 换取用户信息。详见《三步开发社交账号登录(以钉钉登录举例) - Jeff Tian的文章 - 知乎

以开放平台微信登录举例

先构建授权链接

链接如下:

https://open.weixin.qq.com/connect/qrconnect?scope=snsapi_login&state=d3Yvfou3pdgp-UNVZ-i7DTDEbv4rZTWx6Wh7lmxzyvk.98VO-haMdj4.c0L0bnybTEatKpqInU02nQ&response_type=code&appid=wxc09e145146844e43&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Fmaster%2Fbroker%2Fweixin%2Fendpoint

用户使用微信扫描以上链接中展示的二维码后,会跳转到微信的授权页面,用户点击同意后,会跳转到我们的回调地址,并且带上 code 和 state 参数,如下:

https://keycloak.jiwai.win/realms/master/broker/weixin/endpoint?code=011er8000zwPzQ1Fvw200DTBCP1er80K&state=d3Yvfou3pdgp-UNVZ-i7DTDEbv4rZTWx6Wh7lmxzyvk.98VO-haMdj4.c0L0bnybTEatKpqInU02nQ

通过 code 换取 access_token

通过 access_token 换取用户信息

About

Keycloak 微信登录插件,支持 PC 端扫码登录、关注公众号即登录、手机微信等登录方式。

Topics

Resources

Stars

Watchers

Forks

Languages

  • Java 99.9%
  • Dockerfile 0.1%