web-dev-qa-db-ja.com

ASP.NET MVC 5のFacebook v2.4 APIからOAuth ExternalLoginCallbackでメールアドレスにアクセスする

Facebook APIのv2.3では、以下が設定されている場合、ユーザーのメールアドレスはExternalLoginCallbackへのコールバックで返されます。

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

ただし、v2.4(7月8日リリース)のみをターゲットにできるアプリは、メールアドレスをExternalLoginCallbackに返さなくなりました。

これは、リストにあるv2.4の変更に関連している可能性があると思います here ;

宣言型フィールド

モバイルネットワークのパフォーマンスを向上させるために、v2.4のノードとエッジでは、GETリクエストに必要なフィールドを明示的にリクエストする必要があります。例えば、 GET /v2.4/me/feedにはデフォルトで高評価とコメントが含まれなくなりましたが、GET /v2.4/me/feed?fields=comments,likesはデータを返します。詳細については、特定のフィールドをリクエストする方法に関するドキュメントをご覧ください。

このメールアドレスにアクセスするにはどうすればよいですか。

23

これを解決するには、nugetから Facebook SDK for .NET をインストールし、電子メールアドレスを個別に照会する必要がありました。

ExternalLoginCallbackメソッドに、条件を追加してFacebook Graph APIからメールアドレスを入力しました。

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を取得するために、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);
        }
    }
});
57

MVC 6(Asp.net Core 1.0)では、startup.csでFacebookAuthenticationを次のように構成します。

         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);
14