Facebook登录在Windows Phone 7中运行

时间:2014-02-05 09:45:58

标签: wpf facebook windows-phone-7 facebook-graph-api facebook-login

我正在为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按钮:

https://www.facebook.com/dialog/oauth?client_id=123456&redirect_uri=https://www.facebook.com/connect/login_success.html

现在我看到“[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应用程序中,行为会发生如下变化:

首先,网址不同,可能是因为它检测到移动(触摸)设备:

一个。单击按钮:

https://m.facebook.com/login.php?skip_api_login=1&api_key=123456&signed_next=1&next=https://m.facebook.com/dialog/oauth?redirect_uri=https%253A%252F%252Fwww.facebook.com%252Fconnect%252Flogin_success.html&client_id=123456&ret=login&cancel_uri=https://www.facebook.com/connect/login_success.html?error=access_denied&error_code=200&error_description=Permissions+error&error_reason=user_denied%23_=_&display=touch&_rdr

现在我进入登录页面,所以我首先登录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());
        }
    }

但这需要另一个请求,并且它定义为一个黑客。

我做错了吗?应用程序配置不正确吗?

2 个答案:

答案 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));
    }
}