Не удается получить токен доступа в настольном приложении .NET

#c# #.net #facebook #facebook-authentication

#c# #.net #Facebook #facebook-аутентификация

Вопрос:

Я пишу .NET-приложение, которое запускается на компьютере с Windows. Он недоступен через браузер. Проблема в том, что я не могу аутентифицироваться должным образом. В настоящее время я пишу на C # .NET, более конкретно на C #.

  • У меня есть веб-браузерный элемент управления в моей форме.
  • Пользователь входит в facebook через этот элемент управления webbrowser.
  • После входа в систему я запускаю процедуру аутентификации.
  • Затем я восстанавливаю код.

Вот где все идет не так. С помощью этого кода я хочу получить токен доступа. Сгенерированный URL-адрес запроса выглядит следующим образом: https://graph.facebook.com/oauth/access_token?client_id=____MY_APP_ID______amp;redirect_uri=http://localhost/amp;client_secret=_____MY_APP_SECRET_____amp;code=____MY_RETREIVED_CODE_____ и выполняется с помощью приведенного ниже кода.

Пожалуйста, обратите внимание, что мой URL перенаправления http://localhost . Это должно быть нормально, верно?

Кроме того, в настройках моего приложения у меня есть следующая информация.

URL сайта: http://localhost/ Домен сайта: localhost

 private String ExchangeCodeForToken(String code, Uri redirectUrl)
{
    var TokenEndpoint = new Uri("https://graph.facebook.com/oauth/access_token");
    var url = TokenEndpoint   "?"  
                      "client_id="   _AppID   "amp;"  
                      "redirect_uri="   redirectUrl   "amp;"  
                      "client_secret="   _AppSecret   "amp;"  
                      "code="   code;
    var request = WebRequest.CreateDefault(new Uri(url));
    using (var response = request.GetResponse())
    {
        using (var responseStream = response.GetResponseStream())
        {
            using (var responseReader = new StreamReader(responseStream))
            {
                var responseText = responseReader.ReadToEnd();
                var token = responseText.Replace("access_token=", "");
                return token;
            }
        }
     }
}
  

Когда я выполняю это, я получаю эту ошибку:

ошибка http://www.imageupload.org/getfile.php?id=50131amp;a=447f6fcc0ebd4d3f8e8a59a3a6e36ac3amp;t=4de0841camp;o=0889D68FDC35508BA2C6F2689FCBAB7C30A8670CC9647EE598701D8BEC13ED278F0989D393amp;n=autherror.pngamp;i=1

Исключение Webexception не было обработано пользовательским кодом, удаленный сервер вернул ошибку: (400) Неверный запрос.

Вот где, я думаю, я могу ошибаться:

  • Верны ли настройки моего приложения?
  • Должен ли мой URL-адрес перенаправления быть http://localhost , даже если на самом деле там нет службы, прослушивающей его?

Самое главное:

  • как мне избавиться от этой ошибки и восстановить токен доступа?

Заранее спасибо!

Ответ №1:

Вы получаете эту ошибку, потому что вы не должны вызывать этот URL из настольного приложения: насколько я знаю, вы не можете использовать конечную точку токена для аутентификации настольного приложения. Кроме того, вы можете получить токен доступа напрямую (нет необходимости сначала запрашивать код). Вот что вам нужно сделать.

Загрузите следующий URL-адрес во встроенный веб-браузер :

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

Пользователю будет предложено войти в систему, и он будет перенаправлен на этот URL с токеном доступа в URL :

 https://www.facebook.com/connect/login_success.html#access_token=...
  

Таким образом, вы должны обнаружить перенаправление и извлечь токен доступа из URL.

Комментарии:

1. Миллион благодарностей! У меня была точно такая же проблема. Но как бы вы это сделали, если мое приложение работает на терминале? У меня, конечно, не может быть подходящего браузера. Подробнее: Я создаю KDE-Plasmoid для публикации статусов в Facebook account. У меня также не может быть встроенного браузера. Я использую Python. Лучший вариант использования браузера — использовать модуль Mechanize, если это поможет .. 🙂

2. Привет, Thrustmaster. Из-за потока oauth и по соображениям безопасности у вас нет возможности авторизовать пользователя на Facebook без браузера… Вы можете попытаться взломать браузер, имитируя работу с HTTP-запросами на Python, но я не уверен в этом. И вы будете запрашивать имя пользователя и пароль ваших пользователей, что нарушает Условия предоставления услуг Facebook.

3. Спасибо за ответ. Но даже во встроенном браузере я (Facebook) буду запрашивать имя пользователя / пароль. Если это мой браузер, я вполне могу получить имя пользователя и пароль, и это тоже без ведома пользователя.

4. Если вы используете встроенный браузер, у вас на руках не будет учетных данных пользователя, потому что он будет вводить их прямо на веб-сайте Facebook (за исключением, конечно, того, что вы прослушиваете нажатия клавиш). В любом случае, конечный пользователь не будет знать, прослушиваете ли вы его учетные данные или нет, он доверяет разработчику, вы можете делать все, что хотите. Дело не в том, что вы не можете , а в том, что вы не должны . Facebook не облегчит вам жизнь, если вы решите это сделать (без библиотек, без документации и т.д.)

5. Спасибо за ответ. 🙂 Я открываю новый вопрос, посвященный моей проблеме.

Ответ №2:

Спасибо, квинтен!

Однако мне удалось решить свою собственную проблему с помощью C # Facebook SDK. Этот набор для разработки программного обеспечения был действительно большим подспорьем!

В комплект входит множество образцов (включая авторизацию).

Любой, кто программирует на .NET с facebook, должен это проверить! Кодирование для facebook теперь стало намного проще.

http://facebooksdk.codeplex.com/