5

VS 2015でデフォルトのMVCテンプレートを使用してOWIN外部認証を使用する方法を学習しています。Facebookの認証を有効にし、スコープ「電子メール」を追加しました。ユーザが認証された後(thisによる)。それでも、コンテキスト内に電子メールはありません.User JSONオブジェクトとcontext.Emailもnullです。OWINのログイン時にFacebookのメールを取得する

これが欠けているものStartup.Auth.cs

内の関連するコード
var facebookOptions = new FacebookAuthenticationOptions 
     { 
      AppId = "XXXXXX", 
      AppSecret = "XXXXXX", 
      Provider = new FacebookAuthenticationProvider 
      { 
       OnAuthenticated = context => 
       { 
        // Retrieve the OAuth access token to store for subsequent API calls 
        var accessToken = context.AccessToken; 

        // Retrieve the username 
        var facebookUserName = context.UserName; 

        // WHY IS IT EMPTY? 
        var facebookEmail = context.Email; 

        // You can even retrieve the full JSON-serialized user 
        var serializedUser = context.User; 

        return Task.FromResult(0); 
       } 
      } 
     }; 

     facebookOptions.Scope.Add("email"); 

     app.UseFacebookAuthentication(facebookOptions); 

任意のアイデアですか?なぜFacebookの電子メールアドレスが返されないのですか?

+4

ここに潜在的に有用な情報します。http: //stackoverflow.com/a/32636149/3130094 –

+1

ありがとう@JamieDunstan - それは役に立ちました! – Andrey

答えて

4

Facebook API v 2.4では、取り出すフィールドを指定する必要があります。

https://graph.facebook.com/v2.3/me?access_token=XXXXX 

が、FBのAPI v2.4デベロッパーのようにパフォーマンス上の理由から、あなたも、あなたが範囲内で取得するfiledsを指定する必要があります:

https://graph.facebook.com/v2.4/me?fields=id,name,email&access_token=XXXXX 

マイクロソフトFBクライアントの実装であるために使用されるグラフ要求デフォルトでは「?access_tokenは」壊れ要求(余分な疑問符)につながるとして、クエリ文字列にaccess_tokenは添付:

https://graph.facebook.com/v2.4/me?fields=id,name,email?access_token=XXXXX

したがって、カスタムBackchannelHttpHandlerを使用する必要があることを改善するために、まず、我々は、エンドポイントクラスを作成:

public class FacebookBackChannelHandler : HttpClientHandler 
    { 
     protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
     { 
      if (!request.RequestUri.AbsolutePath.Contains("/oauth")) 
      { 
       request.RequestUri = new Uri(request.RequestUri.AbsoluteUri.Replace("?access_token", "&access_token")); 
      } 

      return await base.SendAsync(request, cancellationToken); 
     } 
    } 

をそして、我々は、明示的にUserInformationEndpointを指定するとともに、Facebookの認証オプションでそれを提供します。

var facebookAuthOptions = new FacebookAuthenticationOptions 
     { 
      AppId = ConfigurationManager.AppSettings["FacebookAppId"], 
      AppSecret = ConfigurationManager.AppSettings["FacebookAppSecret"], 
      BackchannelHttpHandler = new FacebookBackChannelHandler(), 
      UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email", 
      Scope = { "email" } 
      <.....> 
     }; 

から:https://stackoverflow.com/a/32636149/3130094

関連する問題