使用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
相关产品推荐
相关产品推荐

