背景
随着GPT的爆火,也想自己部署一个玩玩,推荐潘多拉(github),但存在一个问题,由于潘多拉是手动Token启动,一旦使用Toekn将自部署的第三方系统上线后,可直接使用地址栏访问使用,但这存在自己账户泄露的情况,如果不想让别人直接使用,由于是开源系统,源码上修改,比较费时,此时可通过nginx请求拦截转发到自己的认证系统
自系统认证技术
JWT+Cookie
问题
将自部署的三方系统使用自己系统的权限认证
解决方案
使用Nginx为我们提供的auth_request,结合Cookie子域名共享的机制,实现认证流程
技术细节
- 配置nginx
server{
listen 443 ssl;
listen [::]:443 ssl;
server_name chat.xmdxz.xyz;
ssl_certificate 填你自己的;
ssl_certificate_key 填你自己的;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256;
ssl_prefer_server_ciphers on;
error_log 填你自己的;
rewrite_log off;
location / {
//重点:当访问chat.xmdxz.xyz时,先转向/check路径进行拦截认证
auth_request /check;
//认证失败定义401状态码转向auth_page
error_page 401 = /auth_page;
proxy_pass http://127.0.0.1:8018;
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;
proxy_set_header Host $host;
proxy_buffering off;
}
//认证路径
location = /check {
//表示该路径仅仅为nginx内部访问,一旦出了这个配置文件,则失效
internal;
//自己系统的认证路径
proxy_pass http://127.0.0.1:415/original/common/auth;
error_page 401 = /auth_page;
}
//认证失败后的处理
location = /auth_page{
//强制浏览器不使用缓存,防止缓存带来的还能访问系统
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate";
//如果认证失败,跳转到自己系统的登录页面
return 301 https://xmdxz.xyz/#/login;
}
}
- 自己系统的登录逻辑中添加Cookie逻辑
//同时设置cookie,目前用于子域名跳转的解决方案
// 创建 Cookie 对象
Cookie cookie = new Cookie("token", loginVo.getToken());
// 设置过期时间为负值,即当前会话期间有效
cookie.setMaxAge(365 * 24 * 60 * 60);
// 设置路径
cookie.setPath("/");
// 设置域名,包括所有子域名
cookie.setDomain("xmdxz.xyz");
// 将 Cookie 添加到响应中
cookie.setHttpOnly(true);
response.addCookie(cookie);