5

我正在學習如何使用VS 2015中的默認MVC模板使用OWIN外部驗證。我啓用了Facebook驗證並添加了範圍「電子郵件」,期望用戶的電子郵件由Facebook返回在用戶通過認證後(根據this)。不過,上下文中沒有電子郵件。用戶JSON對象和上下文。電子郵件也是空的。正在檢索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 2.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); 
     } 
    } 

然後我們提供它在Facebook的身份驗證選項有明確指定UserInformationEndpoint沿:

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

相關問題