You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:12:27