0

我正在用 C# 开发一个桌面应用程序。

访问https://www.facebook.com/dialog/oauth?client_id=123后,用户登录并将用户访问令牌附加到重定向 uri。没问题,当登录页面显示在我的表单中的 webbrowser 控件中时,我可以从 url 中提取令牌。

但这不是我想要获得令牌的方式。我的问题是,有没有办法通过 Graph API 调用获取新创建的令牌?

因为我想在用户的标准浏览器中而不是在这个嵌入式网络浏览器中显示登录页面。我为获取用户访问令牌所做的所有努力都导致获取了应用程序访问令牌,在这种情况下这是无用的。

任何提示表示赞赏。

4

2 回答 2

2

// 这是非常原始的,注意它是一个 MVC3 解决方案,但它是用 C# 编写的,我希望它有所帮助。// 它基本上是 FB 上用于“服务器端流程”的 PHP 示例的 C# 版本 // 我已经使用了一段时间并且不得不经历一些痛苦 // 请注意我读到的关于 redirect_uri 的错误//requests 必须相同 // 另请阅读,如果 redirect_uri 没有以 '/' 结尾,则有人遇到问题 // 如果您有任何 ?s 则回发,因为我刚刚开始这个项目并且将尝试和//合并 C# FaceBook SDK

public class AccountController : Controller
    {
        // LoginWithFaceBook
        // First Contact with FB - oauth?client_id ... redirect_uri = /Account/FacebookLinker 
        // according to a bug files on FB redirect_uri MUST BE SAME FOR both trips ( to get the 'code' then exchange the code for 'access_token'
        public ActionResult ConnectFaceBookAccount()
        {
            string APP_ID = HttpContext.Application["FacebookAppId"].ToString();
            string redirect_uri = HttpContext.Application["FacebookOAuthRedirect"].ToString();
            string state = HttpContext.Application["state_guid"].ToString();
            // in this View I simply link to this URL
            ViewBag.FaceBookOAuthUrl = "https://www.facebook.com/dialog/oauth?client_id=" + APP_ID + "&redirect_uri="+redirect_uri+"&state=" + state+"&display=popup";


            return View();
        }

        // Account/FacebookLinker
        //  redirect_uri for both getting 'code' and exchanging for 'access_token'
        public ActionResult FacebookLinker()
        {
            if (!Request.IsAuthenticated)
            {
                Response.Redirect("/Account/LogOn");
            }
            // Per FB DOC, Make sure 'state' var returned is same one you sent to reduce chance of Cross Site Forgery
            if (Request.QueryString["state"].ToString() == HttpContext.Application["state_guid"].ToString())
            {
                try
                {

                    string FBcode = Request.QueryString["code"].ToString();
                    string APP_ID = HttpContext.Application["FacebookAppId"].ToString();
                    string APP_SECRET = HttpContext.Application["FacebookAppSecret"].ToString();
                    string redirect_uri = HttpContext.Application["FacebookOAuthRedirect"].ToString();


                  string FBAccessUrl = "https://graph.facebook.com/oauth/access_token?client_id=" + APP_ID + "&redirect_uri=" + redirect_uri + "&client_secret=" + APP_SECRET + "&code=" + FBcode;


                string accessToken = null;
                // Send the request to exchange the code for access_token
                var accessTokenRequest = System.Net.HttpWebRequest.Create(FBAccessUrl);
                HttpWebResponse response = (HttpWebResponse) accessTokenRequest.GetResponse();

                 // handle response from FB 
                 // this will not be a url with params like the first request to get the 'code'
                Encoding rEncoding = Encoding.GetEncoding(response.CharacterSet);

                using(StreamReader sr = new StreamReader(response.GetResponseStream(),rEncoding))
                {
                    // parse the response to get the value of the 'access_token'
                    accessToken = HttpUtility.ParseQueryString(sr.ReadToEnd()).Get("access_token"); 
                }
                    //TODO
                    // Add to the accessToken for the Logged in User.Identity to a FBUSERS Model
                    // WHen someone Logs in Check to see if they are also in FB
                    // ON Login Page add option to login with FaceBook


                  return View();

                }
                catch (Exception exp)
                {
                    // try to get token failed

                }
            }
            else
            {
                 // state var form FB did not match state var sent

            }
            return View();
        }
于 2012-04-15T12:22:45.800 回答
0

我认为这是可以通过 URL 协议处理程序实现的;

  1. 创建自定义 URL 协议处理程序(MSDN:将应用程序注册到 URL 协议
  2. 创建一个 facebook 页面,将用户访问令牌传递给您的 url 处理程序(例如 myfbapp://accesstoken/{token}
  3. 将 oauth 设置redirect_uri为您的 Facebook 页面
  4. 在您的应用程序中解析访问令牌
于 2012-04-14T20:59:12.380 回答