0

Я разрабатываю настольное приложение на C#.C#: получить токен доступа пользователя

После посещения https://www.facebook.com/dialog/oauth?client_id=123 пользователь входит в систему, а токен доступа пользователя прикреплен к URL-адресу перенаправления. Это не проблема, когда страница входа в систему отображается в элементе управления webbrowser в моей форме, поэтому я могу извлечь токен из URL-адреса.

Но это не так, как я хочу получить токен. Мой вопрос в том, есть ли способ получить только что созданный токен с помощью вызова API Graph?

Потому что я хочу отобразить страницу входа в стандартный браузер пользователя, а не в этот встроенный веб-браузер. Все мои усилия по получению пользователя доступа к токену были получены при получении приложения токена доступа, что бесполезно в этом случае.

Любые советы приветствуются.

ответ

2

// Это очень грубо, и обратите внимание, что это решение MVC3, но оно находится на C#, и я надеюсь, что это поможет. // Это, в основном, версия C# примера PHP для FB для «потока на стороне сервера» // Я был у него на некоторое время и должен был пройти через некоторую боль // Обратите внимание на ошибку, которую я прочитал об этом утверждает, что redirect_uri должен быть одинаковым для обоих запросов // // Также читайте, что у кого-то была проблема, если redirect_uri не закончилась в '/' // Отправляйте назад, если у вас есть какие-либо из них, поскольку я только начинаю этот проект и я собираюсь попробовать и // включить 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(); 
     } 
+0

Как получить «код» и «state_guid». Я также хочу сгенерировать user_access_token –

0

Я думаю, что это возможно с помощью обработчиков протоколов HTTP;

  1. Создание обработчика протокола пользовательских URL (MSDN: Registering an Application to a URL Protocol)
  2. Создать страницу facebook, которая передает маркер доступа пользователя к обработчику URL (напр. myfbapp://accesstoken/{token})
  3. Set OAuth redirect_uri на страницу facebook
  4. Разбор токен доступа в вашей заявке