事由
由于域名下有各种应用,而并非所有应用都具有强壮的授权系统,因此将部分需要保护的应用接入一套合理的统一登入系统就显得尤为重要。这将会极大地保护网站资源安全、避免爬虫嗅探造成子域名资源被收集。
那么为了接入统一授权,首先进行选型,Logto登录系统是一套现代而轻盈的登录框架,而且支持OIDC和OAuth,这为我们后续直接接入Nginx系统提供了很大便利。由于部分老旧或者单页应用并不存在OIDC授权的接口,因此我们期望的是直接通过Nginx的配置实现应用的无感接入,此处以1Panel集成的OpenResty为例,正好可以有效地利用其强化的lua脚本能力做认证。初步设想的架构如下:
Mermaid 图表加载中...
安装依赖
lua中有支持OIDC授权的库zmartzone/lua-resty-openidc,我们直接在OpenResty容器中安装该库和依赖即可。
注意
虽然官方Github中推荐使用luarocks进行安装,然而实测安装失败,参照以下命令使用opm安装即可。
bash
opm get zmartzone/lua-resty-openidc
opm get openresty/lua-resty-string
opm get fffonion/lua-resty-openssl
opm get bungle/lua-resty-session=3.10
安装方法直接使用1Panel控制面板的容器->终端,连接Docker容器内的终端进行安装即可。需要注意最后一条命令的版本指定,反正我在当前版本的OpenResty中跑通了:

编写lua脚本
为了方便配置,我们可以编写一个统一的OIDC的授权脚本,这样在各个站点的配置文件中,只需要修改变量即可接入:
lua
为了方便起见,本例直接将该lua文件储存在映射出的conf.d目录下,即/opt/1panel/apps/openresty/openresty/conf/conf.d/lua/oauth.lua,容器内对应路径为/usr/local/openresty/nginx/conf/conf.d/lua/oauth.lua。可自行修改
创建OIDC应用
在Logto管理员页面中,我们选择创建第三方应用,然后填写对应的名称,即可完成创建。之后记下这些配置信息,以便调用:

注意
上方需要配置回调url,在本例中以https://【你的域名】/oidc/callback为例,可根据后面配置文件调整。
务必注意需要在权限页配置好适当的权限,以便OAuth时读取。
补充Nginx配置
首先在nginx.conf中补充SSL和DNS配置:
nginx
resolver 【DNS服务器】 ipv6=on valid=300s;
resolver_timeout 5s;
lua_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
在需要接入的网站server段补入OIDC端点信息:
nginx
set $oidc_discovery https://【logto的域名】/oidc/.well-known/openid-configuration;
set $oidc_client_id 【应用ID】;
set $oidc_client_secret 【应用秘钥】;
set $oidc_redirect_uri https://$http_host/oidc/callback;
set $oidc_cookie_name 【独立cookie名字】;
加入回调代理:
nginx
# ===== callback =====
location = /oidc/callback {
content_by_lua_file /usr/local/openresty/nginx/conf/conf.d/lua/oauth.lua;
}
在反向代理中加入验证流程,在location ^~ /下加入:
nginx
access_by_lua_file /usr/local/openresty/nginx/conf/conf.d/lua/oauth.lua;
至此,全部接入配置已经完成
效果
访问被保护的域名自动跳转登录页:


顺便夸一下Logto,这个页面可以自行配置css等进行高度定制(当然我懒得搞,雾)
登入后即可自动跳回原页面,完成了统一认证流程。

