@jyuart

Как вернуть данные и токен доступа на фронтенд после OAuth2 аутентификации с бэкенда?

Есть приложение, состоящее из SPA (Angular 10) и ASP.NET Core Web API 3.1. Пытаюсь реализовать аутентификацию с помощью OAuth2 (для начала GitHub).
1. Пользователь кликает на кнопку и получает редирект на бэкенд:
login() {
const returnUrl = 'returnUrl=' + this.document.location.origin;
this.document.location.href = 'http://localhost:5050/auth/ExternalLogin?' + '&' + returnUrl;
}

2. Его перенаправляет на GitHub (в данном случае), где он авторизуется или нет:
[HttpGet]
        public IActionResult ExternalLogin(string provider)
        {
            var callbackUrl = Url.Action("ExternalLoginCallback");
            var authenticationProperties = new AuthenticationProperties { RedirectUri = callbackUrl };
            return this.Challenge(authenticationProperties, provider);
        }

        [HttpGet]
        public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
        {
            var result = await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);

            return this.Ok(new
            {
                NameIdentifier = result.Principal.FindFirstValue(ClaimTypes.NameIdentifier),
                Email = result.Principal.FindFirstValue(ClaimTypes.Email),
                Login = result.Principal.FindFirstValue("urn:github:login")
            });
        }

Код из Startup:
services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = "GitHub";
            })
               .AddOAuth("GitHub", options =>
               {
                   options.ClientId = Configuration["GitHub:ClientId"];
                   options.ClientSecret = Configuration["GitHub:ClientSecret"];
                   options.CallbackPath = new PathString("/github-oauth");
                   options.AuthorizationEndpoint = "https://github.com/login/oauth/authorize";
                   options.TokenEndpoint = "https://github.com/login/oauth/access_token";
                   options.UserInformationEndpoint = "https://api.github.com/user";
                   options.SaveTokens = true;
                   options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
                   options.ClaimActions.MapJsonKey("urn:github:login", "login");
                   options.Events = new OAuthEvents
                   {
                       OnCreatingTicket = async context =>
                       {
                           var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
                           request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                           request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);
                           var response = await context.Backchannel.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);
                           response.EnsureSuccessStatusCode();
                           var json = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
                           context.RunClaimActions(json.RootElement);
                       }
                   };
               })
               .AddCookie();


Непосредственно аутентификация работает, но вопрос в следующем. Сейчас пользователь перенаправляется на бэкенд, где он получает некоторые данные о себе.
Есть вариант реализации, когда он возвращается на главную страницу фронтенда, но в таком случае никакие данные не передаются.
Я хочу сделать так, чтобы после завершения процесса пользователь оказывался на фронтенде, его токен доступа сохранялся в localstorage, а данные он мог подредактировать перед завершением регистрации (поменять логин или добавить то, что github не отдал). Как это реализовать?
  • Вопрос задан
  • 311 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы