3

Я пишу приложение Facebook, в котором перечислены друзья пользователя, перекрестные ссылки с информацией, предоставленной пользователем о них (которая хранится в базе данных Google App Engine). Вот как работает мое приложение:Проверка пользователей Facebook на стороне сервера

После входа пользователя в Facebook, вызов API Графа осуществляется через Javascript SDK от Facebook, чтобы получить список своих друзей. Одновременно запрос AJAX отправляется моему обработчику запросов Google App Engine с идентификатором пользователя Facebook, и обработчик отправляет обратно объект JSON с информацией из базы данных о друзьях пользователя. Эти два списка затем перекрестно ссылаются на компьютер пользователя.

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

Единственный способ, которым я могу думать о том, чтобы обеспечить идентификацию пользователя на стороне пользователя, не выполняя мою собственную систему входа, заключается в том, чтобы включить токен доступа пользователя в запрос AJAX, поскольку токен доступа является доказательством того, что пользователь вошли в Facebook. Обработчик запроса может затем сделать фиктивный запрос API-интерфейса Facebook, чтобы убедиться, что он действителен. Тем не менее, это кажется взломанным, и я не уверен, как справиться с возможностью истечения срока доступа маркера доступа при переходе на сервер App Engine. Я также посмотрел на Facebook Python SDK, хотя я не уверен, как это может помочь.

Как сервер App Engine может проверить, что пользователь Facebook зарегистрирован в моем приложении Facebook?

ответ

4

Попробуйте использовать signed_request вместо отправки равнину facebookID в - то вы можете расшифровать их на сервере, используя secret_id дал на Facebook APP странице. Тогда никто не сможет отправить вам «поддельные» запросы, потому что они не смогут расшифровать на стороне сервера.

Например, у меня есть приложение, которое позволяет пользователям голосовать за данную запись. После того, как пользователь принимают разрешения отправить свой голос на сервер я использую JavaScript:

$.ajax({ 
      type: "POST", 
      url: base_url + 'vote/send', 
      data: { signed_request: response.authResponse.signedRequest, vote:vote }, 
}); 

на стороне сервера, я декодирование signed_request, чтобы получить пользователь FacebookID и сохранить его как законное голосование ... таким образом , никто не может отправить мне фальшивое голосование, потому что signed_request зашифрован тем способом, который только мое приложение может его декодировать.

ответ конечно объект, который приходит из SDK после того, как пользователь одобрил разрешение на использование приложения.