通过Nginx对接私有Zitadel实例的Go应用认证问题求助
反向代理Zitadel实现公网应用认证的问题与解决方案
问题背景
我们部署了仅内网可访问的Zitadel实例(地址为1.1.1.1:443),另有一台公网可访问的服务器(https://foo.bar)托管应用,希望通过Nginx将foo.bar/zitadel反向代理至1.1.1.1:443,实现应用对接Zitadel的认证流程。
当前遇到的异常:
- 应用可连接Zitadel实例,但
/auth/login会重定向至内网地址1.1.1.1,无法完成公网认证 - 若将代码中的
Domain改为foo.bar/zitadel,则触发“Issuer does not match”错误
应用对接代码
const Domain = "1.1.1.1:443" const Key = "12345678901234567890123456789012" const ClientID = "123456789@foo" const RedirectURI = "https://foo.bar/auth/callback" type ConfigZitadel struct { AuthN *authentication.Authenticator[*openid.UserInfoContext[*oidc.IDTokenClaims, *oidc.UserInfo]] Mw *authentication.Interceptor[*openid.UserInfoContext[*oidc.IDTokenClaims, *oidc.UserInfo]] } func NewConfigZitadel() (*ConfigZitadel, error) { config_zitadel := &ConfigZitadel{} ctx := context.Background() authN, err := authentication.New(ctx, zitadel.New(Domain), Key, openid.DefaultAuthentication(ClientID, RedirectURI, Key), ) if err != nil { log.Println("zitadel sdk could not initialize", "error", err) return nil, err } mw := authentication.Middleware(authN) config_zitadel.AuthN = authN config_zitadel.Mw = mw return config_zitadel, nil }
解决方案与可行性分析
这个方案完全可行,无需让Zitadel实例直接暴露公网,只需同步调整Zitadel配置、Nginx反向代理规则和应用代码参数三者即可解决问题:
1. 修改Zitadel外部访问地址配置
Zitadel需要知道自身对外暴露的公网地址,否则会用内网地址生成issuer和重定向链接。根据部署方式设置对应参数:
- Docker部署:添加环境变量
EXTERNAL_DOMAIN=foo.bar/zitadel - 二进制部署:在配置文件中设置
externalDomain: foo.bar/zitadel
这样Zitadel生成的issuer、授权端点等所有公开URL都会使用https://foo.bar/zitadel作为前缀。
2. 配置Nginx反向代理规则
确保Nginx代理时传递正确的请求头,并处理路径重写,示例配置:
location /zitadel/ { proxy_pass https://1.1.1.1:443/; proxy_set_header Host foo.bar; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Real-IP $remote_addr; }
proxy_pass末尾的/会自动将/zitadel/xxx重写为/xxx转发给内网Zitadel- 传递
Host等头信息,让Zitadel识别到外部访问的地址
3. 调整应用代码参数
将代码中的Domain修改为https://foo.bar/zitadel,确保应用从正确的公网端点获取OIDC配置,此时Zitadel返回的issuer会与该地址完全匹配,解决“Issuer does not match”错误。
异常原因说明
- 当
Domain设为1.1.1.1:443时,Zitadel生成的重定向URL使用内网地址,导致前端被导向不可访问的1.1.1.1 - 直接修改
Domain为foo.bar/zitadel但未调整Zitadel配置时,Zitadel返回的issuer仍为内网地址,与应用期望的公网地址不匹配,触发OIDC标准的issuer校验错误
内容的提问来源于stack exchange,提问作者Patrick Visi
相关产品推荐
相关产品推荐

