加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Facebook注销Windows Phone应用程序而无需打开WebBrowser

发布时间:2020-12-15 21:46:23 所属栏目:百科 来源:网络整理
导读:我正在尝试使用Facebook登录和注销操作开发 Windows Phone 7应用程序.我找到了Facebook SDK并通过打开WebBrowser来使用它来执行登录.用户将凭据输入此浏览器并成功登录.此外,我设法登录用户而不使用任何SDK,只是使用http请求,就像SDK实际上做的那样.但是,我
我正在尝试使用Facebook登录和注销操作开发 Windows Phone 7应用程序.我找到了Facebook SDK并通过打开WebBrowser来使用它来执行登录.用户将凭据输入此浏览器并成功登录.此外,我设法登录用户而不使用任何SDK,只是使用http请求,就像SDK实际上做的那样.但是,我想在不使用任何WebBrowser的情况下注销用户,而只是单击按钮.网上有这么多解决方案,建议我打开网页浏览器并将其导航到某个网址以便注销.但是,这不是我想要的.我认为应该有办法通过清除cookie来解决,我不知道该怎么做,或者你建议的任何其他.我的代码的一部分如下:

private static String appID = "";
    private static String appSecret = "";

    public static void login(String[] permissions)
    {
        try
        {
            permissionArray = permissions;

            popup = new Popup();
            popup.Height = 480;
            popup.Width = 480;
            popup.VerticalOffset = 100;
            FacebookLoginUserControl control = new FacebookLoginUserControl();
            control.facebookWebBrowser.Loaded += new RoutedEventHandler(webBrowser_Loaded);
            control.facebookWebBrowser.Navigated += new EventHandler<System.Windows.Navigation.NavigationEventArgs>(webBrowser_Navigated);

            popup.Child = control;
            popup.IsOpen = true;
        }
        catch (Exception e)
        {
            //handle
        }
    }

    private static void webBrowser_Loaded(Object sender,RoutedEventArgs e)
    {
        WebBrowser wb = (WebBrowser)sender;
        String loginUrl = GetFacebookLoginUrl();
        wb.Navigate(new Uri(loginUrl));
    }

    private static String GetFacebookLoginUrl()
    {
        String permissionString = String.Empty;
        if (permissionArray.Length > 0)
            permissionString = String.Join(",",permissionArray);

        var uriParams = new Dictionary<string,string>() {
                    {"client_id",appID},{"response_type","token"},{"scope",permissionString},{"redirect_uri","http://www.facebook.com/connect/login_success.html"},{"display","touch"}
                };
        StringBuilder urlBuilder = new StringBuilder();
        foreach (var current in uriParams)
        {
            if (urlBuilder.Length > 0)
            {
                urlBuilder.Append("&");
            }
            var encoded = HttpUtility.UrlEncode(current.Value);
            urlBuilder.AppendFormat("{0}={1}",current.Key,encoded);
        }
        var loginUrl = "http://www.facebook.com/dialog/oauth?" + urlBuilder.ToString();

        return loginUrl;
    }

    private static void webBrowser_Navigated(Object sender,System.Windows.Navigation.NavigationEventArgs e)
    {
        if (string.IsNullOrEmpty(e.Uri.Fragment)) return;
        if (e.Uri.AbsoluteUri.Replace(e.Uri.Fragment,"") == "http://www.facebook.com/connect/login_success.html")
        {
            string text = HttpUtility.HtmlDecode(e.Uri.Fragment).TrimStart('#');
            var pairs = text.Split('&');
            foreach (var pair in pairs)
            {
                var kvp = pair.Split('=');
                if (kvp.Length == 2)
                {
                    if (kvp[0] == "access_token")
                    {
                        accessToken = kvp[1];
                        MessageBox.Show("Access granted");
                        RequestUserProfile();
                    }
                }
            }
            if (string.IsNullOrEmpty(accessToken))
            {
                MessageBox.Show("Unable to authenticate");
            }
            popup.IsOpen = false;
        }
    }

    private static void RequestUserProfile()
    {
        var profileUrl = string.Format("https://graph.facebook.com/me?access_token={0}",HttpUtility.UrlEncode(accessToken));
        request = (HttpWebRequest)HttpWebRequest.Create(new Uri(profileUrl));
        request.Method = "GET";
        request.BeginGetResponse(result =>
        {
            try
            {
                var resp = (result.AsyncState as HttpWebRequest).EndGetResponse(result);
                using (var strm = resp.GetResponseStream())
                {
                    StreamReader sr = new StreamReader(strm);
                    var responseString = sr.ReadToEnd();

                }
            }
            catch (Exception ex)
            {
                //
            }
        },request);
    }

任何解决问题的想法.
提前致谢

解决方法

使用webBrowser实际上是多么的怪异?如果以编程方式创建WebBrowser对象,它将不可见,除非您将其添加到窗体/页面上的某个位置.如果你想清除Facebook的cookie,解决方案将是这样的:

// Can be invoked from your button_click event
 public void TryLogout()
        {
            webBrowser = new WebBrowser();

            Uri uri = new Uri("http://m.facebook.com/home.php?r",UriKind.Absolute);
            webBrowser.LoadCompleted += new LoadCompletedEventHandler(webBrowser_TryLogoutLoadCompleted);
            webBrowser.Navigate(uri);
        }

然后:

private void webBrowser_TryLogoutLoadCompleted(object sender,EventArgs e)
        {
            try
            {
                var cookies = webBrowser.GetCookies();

                foreach (Cookie cookie in cookies)
                {
                    if (cookie.Domain.Contains("m.facebook.com"))
                    {
                        cookie.Discard = true;
                        cookie.Expired = true;
                    }
                }
            // we've just cleaned up cookies

            }
            finally
            {
                webBrowser.LoadCompleted -= webBrowser_TryLogoutLoadCompleted;
            }
        }

希望这可以帮助.

GetCookies method

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读