Есть приложение, состоящее из 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 не отдал). Как это реализовать?