台式计算机上的Windows应用商店(WebAuthenticationBroker.AuthenticateAsync)的Facebook身份验证(OAuth2)失败

时间:2016-08-03 11:12:27

标签: c# facebook authentication windows-store-apps

我有一个已发布的Xamarin.Forms应用。该应用建议用户通过多个OAuth身份验证提供商(Google,Facebook,Microsoft,Yandex,Vkontakte,Mail.Ru,Odnoklassniki)进行身份验证。

在Windows上,通过Facebook进行身份验证的方式如下:

string clientID = "<client ID from facebook app settings>";

string startUri = "https://m.facebook.com/dialog/oauth/?" + 
    "client_id=" + clientID +
    "&scope=" + "email,public_profile" + 
    "&redirect_uri=" + "https://m.facebook.com/connect/login_success.html" + 
    "&state=" + Guid.NewGuid().ToString("N") + 
    "&response_type=" + "token";

WebAuthenticationBroker.AuthenticateAsync(
    WebAuthenticationOptions.None,
    new Uri(startUri),
    new Uri("https://m.facebook.com/connect/login_success.html"));

相同的原理图但具有不同的Uris用于其他身份验证提供程序并且工作正常。 Facebook身份验证适用于Windows手机,但在Windows 10和Windows 8.1台式计算机上运行失败。失败情景:

  1. 出现WebAuthenticationBroker窗口。 The WebAuthenticationBroker windows appears

  2. facebook身份验证对话框内容会显示几秒钟。 The facebook authentication dialog content appears for a couple of seconds

  3. Facebook身份验证对话框内容消失,而是显示以下文字:&#34; 我们无法立即连接到您需要的服务。检查您的网络连接或稍后再试一次。&#34;。 We can't connect to the service you need right now. Check your network connection or try this again later.

  4. 在第2步和第3步之间,我的应用程序代码都没有执行。许多不同的计算机也是如此。我尝试将Uri从m.facebook.com替换为www.facebook.com无效。

    Task<WebAuthenticationResult>返回的WebAuthenticationBroker.AuthenticateAsyncIsFaulted状态结束,内部存在以下异常:

      

    System.AggregateException:发生了一个或多个错误。 ---&GT;   System.Exception:来自HRESULT的异常:0x800C0503

         

    ---内部异常堆栈跟踪结束---

         

    ---&GT; (内部异常#0)System.Exception:来自HRESULT的异常:0x800C0503&lt; ---

    我应该在哪里进一步挖掘?

2 个答案:

答案 0 :(得分:1)

我一直在与Facebook SDK支持和Microsoft支持密切合作。这很像是在试图同时为自己感到愉快时同时被双方殴打。感到自己被宠坏了,浪费了但又满足了。

长话短说我有一个解决方法,我现在只用于Facebook / Windows桌面组合:

//We need to instruct the WebAuthenticationBroker to end the scenario
//somehow without specifying the callbackUri parameter. This is called 
//`an implicit callback Uri scenario` in which WebAuthenticationBroker
//is expecting to see this Uri for the end:
string callbackUri = WebAuthenticationBroker.GetCurrentApplicationCallbackUri().AbsoluteUri;

//So we need to instruct Facebook authentication to finally redirect to this Uri.
string startUri = "https://m.facebook.com/dialog/oauth/?" + 
    "client_id=" + clientID +
    "&scope=" + "email,public_profile" + 
    "&redirect_uri=" + callbackUri + 
    "&state=" + Guid.NewGuid().ToString("N") + 
    "&response_type=" + "token";

//The workaround is to go with the WebAuthenticationBroker.AuthenticateAsync
//overload which does not accept the callbackUri parameter.
WebAuthenticationBroker.AuthenticateAsync(
    WebAuthenticationOptions.None,
    new Uri(startUri)));

无论是Facebook还是微软都没有帮助解决这个问题或提供任何合理的解释,说明为什么必须将此方案用于Windows桌面。我再次提到:在Windows Phone 8.1 / 10上,显式回调Uri场景运行良好。

我必须提到,为了让这种隐式回调Uri被Facebook身份验证接受,您需要将这些Uris包含在{{>>有效OAuth重定向URI 设置Facebook login参数中你的应用。

  1. https://www.facebook.com/dialog/return/ms
  2. https://m.facebook.com/dialog/return/ms
  3. ...... Facebook的另一个设计杰作。哎呀。

答案 1 :(得分:0)

将此参数添加到startUri“display = popup”,因此您的代码应如下所示:

string startUri = "https://m.facebook.com/dialog/oauth/?" + 
"client_id=" + clientID +
"&display=popup" +
"&scope=" + "email,public_profile" + 
"&redirect_uri=" + "https://m.facebook.com/connect/login_success.html" + 
"&state=" + Guid.NewGuid().ToString("N") + 
"&response_type=" + "token";

显示参数的其他可能值包括:async,iframe,page,popup,touch,wap。