我有一个已发布的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台式计算机上运行失败。失败情景:
Facebook身份验证对话框内容消失,而是显示以下文字:&#34; 我们无法立即连接到您需要的服务。检查您的网络连接或稍后再试一次。&#34;。
在第2步和第3步之间,我的应用程序代码都没有执行。许多不同的计算机也是如此。我尝试将Uri从m.facebook.com
替换为www.facebook.com
无效。
Task<WebAuthenticationResult>
返回的WebAuthenticationBroker.AuthenticateAsync
以IsFaulted
状态结束,内部存在以下异常:
System.AggregateException:发生了一个或多个错误。 ---&GT; System.Exception:来自HRESULT的异常:0x800C0503
---内部异常堆栈跟踪结束---
---&GT; (内部异常#0)System.Exception:来自HRESULT的异常:0x800C0503&lt; ---
我应该在哪里进一步挖掘?
答案 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
参数中你的应用。
...... 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。