Подтвердить что ты не робот

ASP.net core web api: использование токена доступа Facebook/Google OAuth для аутентификации

В течение серверных дней я пытаюсь получить аутентификацию OAuth с Google и Facebook для работы в моем основном проекте ASP.NET ASP.NET.

мой текущий статус:

  • У меня есть проект ASP.net с базовым Web Api, в котором пользователи должны пройти аутентификацию
  • У меня есть веб-приложение angular 2, которое должно использовать мой веб-api (с аутентификацией).
  • У меня есть приложение для Android, которое должно использовать мою веб-api (с проверкой подлинности).

моя цель:

  • Использование Google/Facebook в качестве поставщиков OAuth для входа в систему
  • позже: добавление собственных учетных записей пользователей (возможно, с помощью IdentityServer4)
  • Не нужно перенаправлять на специальный веб-сайт входа (например, решение IdentityServer4). Просто нажмите кнопку facebook/google в приложении, разрешите доступ, сделайте это!

В моем приложении android и angular я могу получить токены доступа из google/facebook. Теперь я хочу использовать неявный поток OAuth, чтобы аутентифицировать пользователя на моем веб-api с помощью указанных токенов доступа (помещая токены в заголовок как токен-носитель)

Есть моя проблема: есть ли какой-нибудь генетический способ сделать это легко? Для этого я не хочу использовать SDK для facebook/google.

Я пробовал следующее:

  • с помощью IdentityServer4. С этим я могу войти в систему с facebook/google на моем веб-сайте, но вам необходимо перенаправить на страницу входа в IdentityServer4. Есть ли какой-либо возможный способ просто нажать на google/fb-Button в моем приложении и войти в систему, без перенаправления на страницу входа в идентификатор сервера?
  • с использованием промежуточного программного обеспечения для проверки подлинности Google/facebook (https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/): Но они не проверяют мой отправленный канал токен (попробовал бесчисленные способы достижения правильной валидации). Возможно ли это использовать в веб-интерфейсе api?
  • пытается использовать Microsoft.AspNetCore.Authentication.JwtBearer-Middleware и самостоятельно вводить необходимые параметры для google/facebook, но также не проверять (а также бесчисленные попытки)

В последние несколько дней я пробовал так много возможных решений, что я полностью застрял и потерял следы того, что мне нужно сделать, чтобы добиться этого. На этом этапе я прочитал почти каждую запись в asp.net web api oauth tutorial/stackoverflow, но не могу понять, как использовать это в моем случае, как я хочу. Большинство учебников предназначены только для веб-сайтов mvc или используют IdentityServer4 с перенаправлением на страницу входа в систему.

Любые предложения или решения? Что мне не хватает?

4b9b3361

Ответ 1

Если я правильно понял, у вас уже есть ваш токен Facebook от Facebook SDK через ваше приложение.
Как и вы, я не мог найти, как это сделать с помощью библиотеки/пакета ASP.NET Core. Поэтому я вернулся к основам.
Я просто вызываю конечную точку своего api с токеном Facebook, проверяю ее на графике Facebook api, и если хорошо, то я регистрирую пользователя (если требуется) и возвращаю токен JWT, как если бы пользователь регистрировал классический путь к имени пользователя/паролю.

[HttpPost]
[AllowAnonymous]
[Route("api/authentication/FacebookLogin")]
public async Task<IActionResult> FacebookLogin([FromBody] FacebookToken facebookToken)
{
    //check token
    var httpClient = new HttpClient { BaseAddress = new Uri("https://graph.facebook.com/v2.9/") };
    var response = await httpClient.GetAsync($"me?access_token={facebookToken.Token}&fields=id,name,email,first_name,last_name,age_range,birthday,gender,locale,picture");
    if (!response.IsSuccessStatusCode) return BadRequest();
    var result = await response.Content.ReadAsStringAsync();
    var facebookAccount = JsonConvert.DeserializeObject<FacebookAccount>(result);

    //register if required
    var facebookUser = _context.FacebookUsers.SingleOrDefault(x => x.Id == facebookAccount.Id);
    if (facebookUser == null)
    {
        var user = new ApplicationUser {UserName = facebookAccount.Name, Email = facebookAccount.Email};
        var result2 = await _userManager.CreateAsync(user);
        if (!result2.Succeeded) return BadRequest();
        facebookUser = new FacebookUser {Id = facebookAccount.Id, UserId = user.Id};
        _context.FacebookUsers.Add(facebookUser);
        _context.SaveChanges();
    }

    //send bearer token
    return Ok(GetToken(facebookUser.UserId));
}