Authentik系统是允许第三方账号登录的,并且Authentik本身也支持了很多协议:Oauth2.0、OpenID、SAML、LDAP等。
Authentik的联结与社交登录页中,已经附带了很多平台的登录方式,包括国外常见的AppleID、亚马逊、微软、github等,或内倒是支持了微信。不过微信只能以企业才能申请到开放端口,个人并不允许。
踩坑开始
即使有些平台官方没有直接支持,官方也预留了一个通用的OpenID OAuth登录接口,可以让用户连接支持通用OpenID、Oauth2.0的平台。
第一个坑:QQ互联是不标准的Oauth提供商。期间还要通过访问https://graph.qq.com/oauth2.0/me来获取openid,再用openid来获取用户信息。
第二个坑:QQ互联对回调地址校准极其严格,结尾必须没有“/”(其他平台大多可有可无,均可兼容)。Authentik系统带有Django的 APPEND_SLASH 会自动 301补斜杠,还没办法改配置,因为改了会引起Authentik其他服务异常。
填坑
QQ互联平台没办法改,只能从Authentik这边入手。
方案:
- 给Authentik添加对应的OAuth登录type,直接支持QQ;
- 替换某个不用的type,将请求地址指向QQ,但是平台认为还是原本的type。
考虑到需要在不影响Authentik工作的情况下,做最小的修改,以兼容QQ互联平台。
本次修改先使用方案2,因为只需要替换一个type,其他不变,就算升级系统也就是重新覆盖一下就可以。方案一还是需要改配置文件,涉及的文件较多。
替换type
Authentik支持的类型中,国内的话微信登录难拿,国外我随便挑discord来替换。同时需要这两个作为第三方登录的应该很少吧。
真的有的话,自己参考一下这两个文件,改一下别的不用的就行,主要就是说明文件不改就行,让Authentik能识别。还有就是挑那种不需要输入URL的才可以。
下面这个压缩包里有这两个type的python文件。
将压缩包下载后,里面有两个文件:wechat.py和discord.py(选一个自己用不到的就行)。
复制到Authentik中:/authentik/sources/oauth/types/wechat.py或/authentik/sources/oauth/types/discord.py
我的Authentik是使用docker部署的,它有两个容器,一个是server,一个是worker,两个容器都要一起替换,然后重启容器。
使用:docker cp wechat.py authentik-server:/authentik/sources/oauth/types/wechat.py
或:docker cp discord.py authentik-server:/authentik/sources/oauth/types/discord.py
创建OAuth应用
- 前往QQ互联平台-应用管理。
- 按要求完成实名验证。
- 点击 添加应用 -> 创建网站应用。
- 根据实际情况填写网站基本信息。
- 回调域填写标准:https://www.example.com/source/oauth/callback/Slug(Slug就是等下在Authentik中创建的第三方登录Source里的Slug。这里写错没事,因为回调域可以随便更改不用审核。前提是你的域名已经是工信部备案过的)
- 审核通过后就可以拿到 APP ID 和 APP Key 了(在应用管理,查看应用,就在顶上)
添加source
- 在目录→联结与社交登录→New源,新建source。
- 选择Discord OAuth Source 或 WeChat OAuth Source。
- 填上Source Name和Slug,这个可以根据自己的需要填,不一定定死discord或者wechat。比如这里填QQ、腾讯QQ都可以。Slug和回调地址有关,Slug就是回调地址结尾的地点。
- 其他可以默认:使用唯一识别符链接用户(这个安全)。
- 图标,可以用默认的,也可以自己在 自定义→文件 里上传图标文件。
- 消费者 Key:填入前面获取到的APP ID
- 消费者 Secret:填入前面获取到的APP Key
- 流程设置里,默认就行。Authentication Flow是default-source-authentication(这个是专门给第三方登录,或者自己建的社交登录流程也可以,不能选default-authentication-flow,要不然社交登录后会跳到账号密码登录界面,而不是登录成功)
- 注册流程不选,官方对于第三方登录,更倾向于用户使用账号密码登录,然后在 设置→已连接服务 中绑定对应的第三方登录。而不是先使用第三方登录,再绑定本地账号。
- 添加完Source后,前往 流程与阶段 → 流程 中,给目前使用的登录流程的 Identification Stage 阶段添加第三方登录源。
编辑对应的阶段,到最后的“源设置”中,将你要使用的源添加到右边即可。


添加网站回调规则
在网站的NGINX配置中添加一条匹配规则(非必须,但推荐,要根据实际改一下):
location = /source/oauth/callback/qq {
proxy_pass http://127.0.0.1:9000/source/oauth/callback/qq/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}至此,结束。