Основная проблема в следующем:
Моя конечная точка '/ api / users / githublogin' работает нормально, если ее запрашивает обычный GET из браузера или обычный GET из Postman.Однако XHR, fetch и axios все выдают одну и ту же ошибку:
Доступ к выборке в 'https://github.com/login/oauth/authorize?etc' (перенаправлено из' https://localhost:5001/api/users/githublogin') из источника 'https://localhost:5001' был заблокирован политикой CORS: в запрашиваемом ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Если непрозрачный ответ удовлетворяет ваши потребности, установите режим запроса «no-cors», чтобы получить ресурсс отключенным CORS.
Существует пара связанных вопросов, больше связанных с Angular, чем с React, но проблема, похоже, та же:
Включить CORS в ASP .NET Core 2.1 Web Api
Нет заголовка «Access-Control-Allow-Origin». XmlHttpRequest
.NET CORE 2.0 Angular 5: разрешение Cors
Локальный запрос пост-выборки Javascript завершается неудачно с вызовом веб-API ASP.NET Core 2.2. CORS включается
Я реализовал их ответы без успеха.
Вот мой серверкод стороны, касающийся политики CORS:
внутри метода ConfigureServices:
services.AddCors();
внутри метода Configure:
app.UseCors(x => x
.AllowAnyHeader()
.AllowAnyMethod()
.AllowAnyOrigin()
.AllowCredentials());
на моей клиентской стороне, кнопка вызывает этокод:
fetch('/api/users/githublogin');
Ниже следует журнал сервера в момент выполнения неудавшегося запроса:
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET https://localhost:5001/api/users/githublogin application/json
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 GET https://localhost:5001/api/users/githublogin application/json
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
Executing endpoint 'web_server.Controllers.UsersController.GitHubLogin (web-server)'
Microsoft.AspNetCore.Routing.EndpointMiddleware:Information: Executing endpoint 'web_server.Controllers.UsersController.GitHubLogin (web-server)'
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[3]
Route matched with {action = "GitHubLogin", controller = "Users"}. Executing controller action with signature Microsoft.AspNetCore.Mvc.ActionResult GitHubLogin(System.String) on controller web_server.Controllers.UsersController (web-server).
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Route matched with {action = "GitHubLogin", controller = "Users"}. Executing controller action with signature Microsoft.AspNetCore.Mvc.ActionResult GitHubLogin(System.String) on controller web_server.Controllers.UsersController (web-server).
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
Executing action method web_server.Controllers.UsersController.GitHubLogin (web-server) - Validation state: Valid
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executing action method web_server.Controllers.UsersController.GitHubLogin (web-server) - Validation state: Valid
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action method web_server.Controllers.UsersController.GitHubLogin (web-server), returned result Microsoft.AspNetCore.Mvc.ChallengeResult in 0.7161ms.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
Executed action method web_server.Controllers.UsersController.GitHubLogin (web-server), returned result Microsoft.AspNetCore.Mvc.ChallengeResult in 0.7161ms.
info: Microsoft.AspNetCore.Mvc.ChallengeResult[1]
Executing ChallengeResult with authentication schemes ().
Microsoft.AspNetCore.Mvc.ChallengeResult:Information: Executing ChallengeResult with authentication schemes ().
info: Microsoft.AspNetCore.Authentication.OAuth.OAuthHandler`1[[Microsoft.AspNetCore.Authentication.OAuth.OAuthOptions, Microsoft.AspNetCore.Authentication.OAuth, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]][12]
AuthenticationScheme: GitHub was challenged.
Microsoft.AspNetCore.Authentication.OAuth.OAuthHandler`1[[Microsoft.AspNetCore.Authentication.OAuth.OAuthOptions, Microsoft.AspNetCore.Authentication.OAuth, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]]:Information: AuthenticationScheme: GitHub was challenged.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
Executed action web_server.Controllers.UsersController.GitHubLogin (web-server) in 76.0766ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
Executed endpoint 'web_server.Controllers.UsersController.GitHubLogin (web-server)'
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action web_server.Controllers.UsersController.GitHubLogin (web-server) in 76.0766ms
Microsoft.AspNetCore.Routing.EndpointMiddleware:Information: Executed endpoint 'web_server.Controllers.UsersController.GitHubLogin (web-server)'
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 145.364ms 302
Request finished in 145.364ms 302
Ничего не касается CORS.На самом деле во всем журнале сервера упоминается только это:
warn: Microsoft.AspNetCore.Cors.Infrastructure.CorsService[11]
The CORS protocol does not allow specifying a wildcard (any) origin and credentials at the same time. Configure the policy by listing individual origins if credentials needs to be supported.
Microsoft.AspNetCore.Cors.Infrastructure.CorsService:Warning: The CORS protocol does not allow specifying a wildcard (any) origin and credentials at the same time. Configure the policy by listing individual origins if credentials needs to be supported.
info: Microsoft.AspNetCore.Cors.Infrastructure.CorsService[4]
CORS policy execution successful.
Microsoft.AspNetCore.Cors.Infrastructure.CorsService:Information: CORS policy execution successful.
Теперь мне кажется, что мой сервер правильно выполняет действия, которые он должен выполнять.То, что 302 Found (если я не ошибаюсь) - это, по сути, сигнал клиенту о перенаправлении на эту конечную точку github.Итак, если мой сервер не генерирует исключение, связанное с CORS, для запроса (или, тем не менее, это работает), и на самом деле установлен флаг AllowAnyOrigins, почему клиент получает эту ошибку?И почему он не получает его, когда браузер отправляет запрос GET?
Следует отметить, что это сервер разработки.В соответствии с документацией, я использую опцию spa.UseProxyToSpaDevelopmentServer("http://localhost:3000");
.Это единственное, что я могу себе представить, это связываться со мной, поскольку технически запросы поступают из разных источников (с порта 3000 на порт 5001), но я считаю, что это не должно быть проблемой, учитывая флаг AllowAnyOrigins.
API был построен на основе базового шаблона веб-интерфейса ASP.NET Core 2.2.Клиент был собран с помощью create-реакции-приложения.Они оба очень шаблонные.
Может ли кто-нибудь помочь объяснить это?