Храните UserTokens, сгенерированные удостоверением ASP.Net Core для внешнего поставщика входа в систему.

Я использую Facebook в качестве внешнего входа в учетную запись ASP.Net Core. Я хотел бы, даже если пользователь вошел в систему через Facebook, пользователь заполнил свой профиль на веб-сайте. Для этого я использую метод ExternalLoginCallback, из которого я хотел бы получить данные из Facebook, такие как дата рождения, местоположение (страна),...

Одна проблема заключается в том, что если пользователь снял некоторые разрешения, вызов Facebook по умолчанию завершится ошибкой:

var info = await _signInManager.GetExternalLoginInfoAsync();
if (info == null)
    return RedirectToAction(nameof(Login));

// Sign in the user with this external login provider if the user already has a login.
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false);

Мне также потребуется выполнить некоторые дополнительные проверки пользовательских данных, что потребует непосредственного вызова Graph API.

Мои точки блокировки: - В методе ExternalLoginCallback мне нужно было бы разделить «страну» и «день рождения», чтобы Facebook API не возвращал ошибку в случае, если пользователь не предоставил разрешение. - Для этого мне понадобится пользователь access_token (и для дополнительных вызовов в методе), я не вижу, как его получить, даже если он используется структурой идентификации Facebook. После создания профиля я хотел бы получить доступ к этому access_token, который должен храниться в таблице UserTokens (наверное?), но я не могу ее там найти, таблица пуста. (мой DbContext - это класс, расширяющий IdentityDbContext<AppUser, AppRole, long>, не знаю, влияет ли это)

Я нашел этот ответ https://stackoverflow.com/a/42670559/4881677, который может помочь, но этого недостаточно.

Любая помощь? :)




Ответы (1)


Чтобы сохранить токен пользователя Facebook, необходимо указать его в настройках (по умолчанию не сохраняется).

var fo = new FacebookOptions();
fo.SaveTokens = true;

Оттуда мы можем вызвать разрешения метода графа, чтобы получить доступные разрешения: https://graph.facebook.com/me/permissions?access_token={token}

Тогда его можно прочитать примерно так:

foreach (var perm in data)
{
   perms.Add((string)perm["permission"], (string)perm["status"]);
}
person Jean    schedule 08.08.2017