我正在为Windows Phone应用尝试“使用facebook登录”功能。我有一个非常小的原型,页面上有一个按钮和一个webbrowser。单击该按钮可将浏览器定向到Facebook API指定的URL,以便使用当前登录用户的详细信息授权应用程序。
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Button Click="ButtonBase_OnClick">Clic</Button>
<phone:WebBrowser Grid.Row="1" x:Name="webBrowser" Navigated="WebBrowser_OnNavigated"/>
</Grid>
背后的代码如下:
private const string AppId = "123456"; // In my code I've put the correct App ID.
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
webBrowser.Navigate(new Uri("https://www.facebook.com/dialog/oauth?client_id=" + AppId + "&redirect_uri=" + Uri.EscapeUriString(@"https://www.facebook.com/connect/login_success.html")));
}
private void WebBrowser_OnNavigated(object sender, NavigationEventArgs e)
{
var x = e.Uri.ToString();
} // BreakPoint set here to inspect 'x'
放在WPF应用程序中的这段确切代码按预期工作。也就是说,如果我尚未授权应用程序,则“OnNavigated”事件处理程序的第一次点击会反映上面的URL,然后在授权后会有一个包含授权令牌的URL。这是我作为WPF应用运行它时的URL和步骤:
一个。启动应用程序,clic按钮:
现在我看到“[your_app_name]将收到有关您的以下信息:公开个人资料和朋友列表”。我点击OK。
B中。我被重定向到:
=“&GT; HTTPS:?//www.facebook.com/connect/login_success.html代码= AQAOJ7H6lK7dsRCJPRjVRVPZmxQrZ7ksWyqb87MfagEc1eatw_1n4ijY0IpDmbVQEg6Un3nmrvzhiiynM4S_l5S_ChgD7ZOVSf-JvxyD8S5sCHFUtBZ9H8lCrT0Lh7aRDgKW1u1XbWuUfcbXl2i6FndWG9Svk9bssRq7F4O-XrPsnK - b31qrFLptzrA0saC1stWoMhyR9vXkiLevxADQ7GHpeGQeu29mOhIaXWBtJy1Wlvins346kNR8Pi77wwpwAt5BzYsTRXdbYxbFdAPDJI2RJyqv4IMKGR0BucmtX9lrmBWcfJeMLzMag-GNDJ5I4U# =
(为了保护我的隐私,我在上面的代码中更改了一些字符)
现在这很棒,这就是我需要的。我将使用相同的代码并将其放在Windows Phone 7.1应用程序中,行为会发生如下变化:
首先,网址不同,可能是因为它检测到移动(触摸)设备:
一个。单击按钮:
现在我进入登录页面,所以我首先登录facebook。我登陆了。
B中。我到了:
RDR#= _“&GT; HTTPS://m.facebook.com/dialog/oauth REDIRECT_URI = HTTPS:?//www.facebook.com/connect/login_success.html& CLIENT_ID = 123456&安培; RET =登录&安培; EXT = 1391596741&安培;散列= AeYEMbLJMwI3QhOE&安培; refsrc = HTTPS://m.facebook.com/login.php& REFID = 9&安培; m_sess = c2VzczoxMDAwMDAwOTg1MjE5NzM6MzM6Ti13TjN3eUERd3ZrR1E6MjoxMzkxNTkzMTQxOjMwODE&安培; RDR# = _
在此页面,我会被问到是否要授权该应用。我点击OK。
℃。我被重定向到https://m.facebook.com/dialog/oauth/read(没有其他查询字符串)。 这是我的问题
此时我感到难过,因为我没有身份验证令牌。解决方法是尝试将浏览器再次重定向到第一个URL(请参阅ButtonBase_OnClick),这将有效。
这意味着将OnNavigated事件处理程序更改为:
private void WebBrowser_OnNavigated(object sender, NavigationEventArgs e)
{
var x = e.Uri.ToString();
if (x == @"https://m.facebook.com/dialog/oauth/read")
{
ButtonBase_OnClick(sender, new RoutedEventArgs());
}
}
但这需要另一个请求,并且它定义为一个黑客。
我做错了吗?应用程序配置不正确吗?
答案 0 :(得分:1)
为什么使用旧方法使用此方法: http://facebooksdk.net/docs/phone/tutorial/,这也是一种非常简单的方法,需要1-2个小时才能完成设置 我在我的应用程序中使用它,它对我很有用我在我的应用程序中注册用户并存储所有细节。
答案 1 :(得分:1)
我的WP7.5应用程序也适用于WP8。在这个Facebook SDk for .Net诞生之前,它正在使用graph api。
string strLoginURL = "https://graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri=http://www.facebook.com/connect/login_success.html&type=user_agent&display=touch&scope=publish_stream,user_hometown";
string strAppID = "123456789101112";
string strPostMessageURL = "https://graph.facebook.com/yourpageid/feed";
string strAccessToken = String.Empty;
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
webBrowser.Navigate(new Uri(string.Format(strLoginURL, strAppID), UriKind.Absolute));
}
private void webBrowser_LoadCompleted(object sender, NavigationEventArgs e)
{
string strSourceString = objAuthorizeBrowserControl.Source.ToString();
//string strSourceString = e.Uri.OriginalString.ToLower();
if (strSourceString.Contains("access_token"))
{
int index1 = strSourceString.IndexOf("access_token");
int index2 = strSourceString.IndexOf("expires_in");
strAccessToken = strSourceString.Substring(index1 + 13, index2 - (index1 + 14));
}
/*...
else
logging in and authorize app will get redirected automatically untill access token is generated.
...*/
if(strAccessToken != String.Empty)
{
WebClient wc = new WebClient();
string strParametersToPost = "access_token=" + strAccessToken + "&message=" + HttpUtility.UrlEncode(yourcontenttopost);
wc.UploadStringAsync(strPostMessageURL, "POST", strParametersToPost);
// you can use wc.UploadStringCompleted Event to capture the result.
}
}
private void webBrowser_Navigating(object sender, NavigatingEventArgs e)
{
string strSourceString = objAuthorizeBrowserControl.Source.ToString();
//string strSourceString = e.Uri.OriginalString.ToLower();
if (strSourceString.Contains("access_token"))
{
int index1 = strSourceString.IndexOf("access_token");
int index2 = strSourceString.IndexOf("expires_in");
strAccessToken = strSourceString.Substring(index1 + 13, index2 - (index1 + 14));
}
}