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

Получите доступ к адресу электронной почты в OAuth ExternalLoginCallback из Facebook v2.4 API в ASP.NET MVC 5

С v2.3 API Facebook, при условии, что установлено следующее: адрес электронной почты пользователей будет возвращен в обратном вызове ExternalLoginCallback;

app.UseFacebookAuthentication(new FacebookAuthenticationOptions
{
    AppId = "XXX",
    AppSecret = "XXX",
    Scope = { "email" }
});

Тем не менее, любое приложение, которое может ориентироваться только на v2.4 (выпущено 8 июля), больше не возвращает адрес электронной почты в ExternalLoginCallback.

Я думаю, что это может быть связано с изменениями v2.4, перечисленными здесь;

Декларативные поля

Чтобы повысить производительность в мобильных сетях, Узлы и кромки в версии 2.4 требуют, чтобы вы явно запрашивали поле (ы), которое необходимо для ваших запросов GET. Например, GET /v2.4/me/feed больше не включает в себя предпочтения и комментарии по умолчанию, но GET /v2.4/me/feed?fields=comments,likes вернет данные. Для большего подробности см. в документах о том, как запрашивать определенные поля.

Как я могу получить доступ к этому адресу электронной почты сейчас?

4b9b3361

Ответ 1

Чтобы решить эту проблему, мне пришлось установить Facebook SDK для .NET из nuget и запросить адрес электронной почты отдельно.

В методе ExternalLoginCallback я добавил условие для заполнения адреса электронной почты из API графиков Facebook;

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

if (loginInfo == null)
{
    return RedirectToAction("Login");
}

// added the following lines
if (loginInfo.Login.LoginProvider == "Facebook")
{
    var identity = AuthenticationManager.GetExternalIdentity(DefaultAuthenticationTypes.ExternalCookie);
    var access_token = identity.FindFirstValue("FacebookAccessToken");
    var fb = new FacebookClient(access_token);
    dynamic myInfo = fb.Get("/me?fields=email"); // specify the email field
    loginInfo.Email = myInfo.email;
}

И чтобы получить FacebookAccessToken я extended ConfigureAuth;

app.UseFacebookAuthentication(new FacebookAuthenticationOptions
{
    AppId = "XXX",
    AppSecret = "XXX",
    Scope = { "email" },
    Provider = new FacebookAuthenticationProvider
    {
        OnAuthenticated = context =>
        {
            context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken));
            return Task.FromResult(true);
        }
    }
});

Ответ 2

В MVC 6 (Asp.net Core 1.0), настроив функцию FacebookAuthentication в startup.cs следующим образом:

         app.UseFacebookAuthentication(options =>
            {
                options.AppId = Configuration["Authentication:Facebook:AppId"];
                options.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
                options.Scope.Add("email");
                options.UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email,first_name,last_name";
            });

Я мог бы получить электронное письмо. То есть:

   var info = await _signInManager.GetExternalLoginInfoAsync();
   var email = info.ExternalPrincipal.FindFirstValue(ClaimTypes.Email);