C#: получить токен доступа пользователя

Я разрабатываю настольное приложение на С#.

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

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

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

Любые подсказки приветствуются.


person m4niac    schedule 13.04.2012    source источник


Ответы (2)


// Это очень сырое, и обратите внимание, что это решение MVC3, но оно на C#, и я надеюсь, что оно поможет. // По сути, это C#-версия примера PHP на FB для 'Server Side Flow' // Я занимался этим некоторое время, и мне пришлось пройти через некоторую боль // Обратите внимание на ошибку, о которой я читал, в которой говорится о redirect_uri должно быть одинаковым для обоих // запросов // Также читайте, что у кого-то была проблема, если 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();
        }
person Alex    schedule 15.04.2012
comment
Как получить код и state_guid. я также хочу сгенерировать user_access_token - person Nimit Joshi; 06.01.2017

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

  1. Создайте собственный обработчик протокола URL (MSDN: Регистрация приложения в протоколе URL)
  2. Создайте страницу facebook, которая передает токен доступа пользователя вашему обработчику URL (например, myfbapp://accesstoken/{token})
  3. Установите oauth redirect_uri на свою страницу в Facebook
  4. Анализ токена доступа в вашем приложении
person Mehmet Osmanoglu    schedule 14.04.2012