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

使用OpenID和Zitadel保护Axum应用时的受众验证错误问题

问题成因与解决方案

额外受众的来源

那个数字ID213170295903617281是Zitadel的组织ID。Zitadel默认会将用户所属组织的ID添加到ID Token的aud(受众)字段中,目的是标识该Token不仅关联你的客户端,还绑定了用户所在的组织上下文。这种行为常见于使用组织级客户端或用户归属特定组织的场景。

正确处理方式

不要直接禁用受众检查(会降低安全性),推荐以下几种方案:

1. 在Zitadel控制台调整客户端配置

进入Zitadel的客户端设置页面,找到ID Token受众相关选项,手动指定仅包含你的客户端ID213170529090208001@mydemo,取消自动添加组织ID的行为。具体路径一般是:客户端 -> 认证 -> ID Token -> 受众,修改后重新生成Token即可。

2. 在openidconnect crate中添加信任的额外受众

在创建Client实例时,将组织ID加入信任的受众列表,让验证器认可该ID的合法性:

use openidconnect::AdditionalAudience;

let client = Client::new(
    "213170529090208001@mydemo".to_string(),
    None, // 根据你的客户端类型填Secret或None
    auth_uri,
    Some(token_uri)
)
// 添加组织ID为信任受众
.set_additional_audience(AdditionalAudience::Exact("213170295903617281".to_string()))
.set_id_token_verifier(id_token_verifier);

之后再调用id_token.claims()就不会触发受众错误。

3. 动态验证(适用于组织ID不固定的场景)

如果你的应用需要支持多个组织,无法提前指定固定组织ID,可以禁用严格的受众匹配,但手动验证客户端ID必须在受众列表中,兼顾安全性和灵活性:

// 禁用严格匹配,但保留基础验证
let claims = id_token.claims(
    &client.id_token_verifier().required_audience_match(false),
    &nonce
)?;

// 手动检查客户端ID是否在受众列表中
let client_id = "213170529090208001@mydemo";
if !claims.audience().iter().any(|aud| aud == client_id) {
    return Err(openidconnect::OpenIdConnectError::InvalidAudience(
        format!("Client ID {} not found in audience", client_id)
    ));
}

内容的提问来源于stack exchange,提问作者Achim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:15:18