Как передать информацию обратно в мое приложение в рамках процесса входа в Facebook? - PullRequest
0 голосов
/ 07 марта 2012

Я смотрю на код .Net, который выполняет вход на Facebook с использованием оболочек библиотеки C # /. Net.

Я хотел бы передать идентификатор при попытке входа в систему, чтобы Facebook передал его мне после аутентификации пользователя.

Я создаю URL перенаправления для запроса вручную, и я попробовал оба из следующих без особого успеха:

oAuthClient.RedirectUri = 
  new Uri( "http://localhost:3434/fbOAuth?token=" + HttpUtility.UrlEncode( token ) ); 
  //fails when attempting to get access token - 
  //"oAuthClient.ExchangeCodeForAccessToken( code )" throws an exception.

var loginUri = oAuthClient.GetLoginUrl( new Dictionary<string, object>
        { { "state", returnUrl }, {"app_data", HttpUtility.UrlEncode(token)} } ); 
//doesn't pass app_data back to my application

Как вы передаете аргументы в ваше приложение как часть процесса входа в Facebook?

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Я использую Facebook C # SDK для создания приложений Facebook тоже. То, что я не использую, это их аутентификация. По моему опыту, аутентификация - самая сложная часть всей реализации приложения Facebook. Сделать это правильно для всех устройств и всех браузеров сложно.

Вы можете использовать параметр state для передачи выбранных вами данных в Facebook как часть дизайна OAuth на стороне сервера. Facebook C # SDK решил использовать параметр state для предоставления контекста, куда перенаправить пользователя по завершении аутентификации. Это не то, как Facebook намеревался использовать state. От https://developers.facebook.com/docs/authentication/:

Подделка межсайтовых запросов (CSRF)

Подделка межсайтовых запросов - это атака, при которой доверенный (аутентифицированный и авторизованный) пользователь неосознанно выполняет действие на веб-сайте. Чтобы предотвратить эту атаку, вы должны передать идентификатор в параметре состояния, а затем проверить соответствие параметров состояния в ответе. Мы настоятельно рекомендуем, чтобы любое приложение, реализующее имя пользователя Facebook, включало защиту CSRF с использованием этого механизма.

В моей собственной реализации OAuth на стороне сервера я генерирую GUID, объединяю некоторую информацию о состоянии, такую ​​как контроллер, к которой необходимо вернуться, шифрую эту строку и передаю ее в качестве параметра состояния.

Когда он возвращается, я расшифровываю его и ухожу. Вы можете сделать что-то подобное, чтобы передать любые данные о состоянии, которые вам нужны.

Дизайн OAuth на стороне сервера довольно прост и хорошо документирован на странице, указанной выше.

0 голосов
/ 08 марта 2012

Я использую следующий код в ActionResult.Обратите внимание на мой комментарий на ваш вопрос, чтобы не использовать «localhost» в URI перенаправления:

string returnUrl = "http://productionserver.com/account/fblogon";
#if DEBUG
  returnUrl = "http://local.developmentserver.com:12345/account/fblogon"; // add this host in hostfile to 127.0.0.1
#endif
var parameters = new Dictionary<string, object> { { "response_type", "code" }, { "display", "page" } };
parameters["redirect_uri"] = returnUrl;
var url = oauth.GetLoginUrl(parameters).OriginalString;
return Redirect(url);
...