Swagger授权时提示“Auth ErrorTypeError: Failed to fetch”问题求助
核心问题分析
从现象来看,Token请求URL与配置不符、返回404且触发CORS错误,核心原因集中在端点配置错误、OAuth流程参数冲突或Swagger前后端配置不匹配,以下是具体排查方向:
1. 修正Token端点URL格式
你的TokenUrl使用了/common/路径,但结合指定的tenantId,正确的Azure AD v2 Token端点需用租户ID替换common:
TokenUrl = new("https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token"),
common是多租户场景的占位符,指定具体tenantId后必须替换,否则会请求错误端点导致404。
2. 解决PKCE与Client Secret的冲突
你同时开启了OAuthUsePkce()和配置了OAuthClientSecret,这两者存在逻辑冲突:
- PKCE属于公共客户端流程,不需要客户端密钥,若用PKCE,删除
options.OAuthClientSecret("HakunaMatata");,并确保Azure AD应用注册配置为"公共客户端" - 若使用机密客户端流程,关闭
OAuthUsePkce(),保留Client Secret配置
3. 确保Scope配置完全一致
检查AddSecurityDefinition中的Scopes与SwaggerUI的OAuthScopes格式、拼写完全匹配。使用Graph的.default scope时,必须在Azure AD应用注册中添加Graph API权限并完成管理员同意,否则会导致登录页无法加载。
4. 验证Authorization Code流程配置
确认Azure AD应用注册的以下设置:
- 重定向URI类型为Web(而非SPA)
- 已启用"授权代码流"(在"身份验证"→"高级设置"中确认)
OAuthClientId与应用注册的客户端ID完全一致
5. 排查CORS错误根源
Token端点的CORS错误大概率是请求地址错误导致的间接问题:
- 若使用PKCE,确保Swagger UI的Token请求为
POST方式(Azure AD默认允许跨域POST请求) - 可临时切换到HTTP的Swagger端点(
http://localhost:7001/swagger)测试,排除HTTPS证书相关的跨域问题
6. 检查OpenAPI文档的配置生效情况
访问https://localhost:7001/swagger/v1/swagger.json,查看components/securitySchemes/oauth2/flows/authorizationCode下的tokenUrl是否与配置一致。若不一致,检查AddSwaggerGen的配置顺序,确保其在AddControllers之后执行。
7. 直接测试Token端点有效性
用Postman手动请求修正后的Token端点,传入参数:client_id、code、redirect_uri、grant_type=authorization_code(若用机密客户端需加client_secret),确认是否能获取Token。若Postman请求失败,重点排查应用注册的权限、密钥是否正确;若成功,则问题出在Swagger UI的配置逻辑上。
内容的提问来源于stack exchange,提问作者Konrad Viltersten

