使用MSAL Go实现Microsoft EntraID OIDC认证时重定向URI异常求助
问题分析与解决
核心原因
MSAL Go 针对**公共客户端(Public Client)**的交互式认证有默认行为:当你仅指定 http://127.0.0.1 这类不带端口的重定向URI时,库会自动随机分配一个本地端口用于接收认证回调,这就导致实际请求的重定向URI(比如http://localhost:51276)和你在Entra ID里配置的URI不匹配,触发报错。
另外,你当前的代码虽然调用了WithRedirectURI,但传入的http://127.0.0.1不符合交互式认证的要求——公共客户端的交互式回调必须包含端口(固定或由库生成,但需提前配置对应规则)。
解决步骤
1. 修正代码中的重定向URI
显式指定一个带固定端口的重定向URI,同时确保该端口未被占用。修改后的代码如下:
func AcquireTokenOIDC() error { client, err := public.New( clientID, public.WithAuthority(fmt.Sprintf("https://login.microsoftonline.com/%s/v2.0", tenantID)), ) if err != nil { return fmt.Errorf("error creating public client: %s", err.Error()) } scopes := []string{"openid", "profile", "email"} // 显式指定带固定端口的重定向URI result, err := client.AcquireTokenInteractive(context.Background(), scopes, public.WithRedirectURI("http://127.0.0.1:51276")) if err != nil { return fmt.Errorf("error acquiring access token: %s", err.Error()) } accessToken = result.AccessToken tokenExpiryTime = result.ExpiresOn return nil }
2. 在Entra ID中配置对应重定向URI
进入你的Entra ID应用注册页面:
- 切换到身份验证标签页
- 在移动和桌面应用分类下,添加重定向URI:
http://127.0.0.1:51276(和代码中完全一致) - 保存配置
额外注意事项
- 确保你的应用注册类型为公共客户端:在应用注册的概述标签页,确认"支持的账户类型"和"公共客户端/设备流"已正确配置(公共客户端无需客户端密钥)。
- 如果希望使用随机端口(不固定端口),可以在Entra ID中添加
http://localhost(不带端口)作为重定向URI,MSAL Go会自动兼容任意本地端口的回调请求,但这种方式仅适用于v2.0端点的公共客户端。
内容的提问来源于stack exchange,提问作者fhcat
相关产品推荐
相关产品推荐

