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
はデータを返します。詳細については、特定のフィールドをリクエストする方法に関するドキュメントをご覧ください。
このメールアドレスにアクセスするにはどうすればよいですか。
これを解決するには、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);
}
}
});
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);