2013-07-16 1 views
4

Я и моя команда работают над собственной мобильной социальной сетью для Android, которая позволяет пользователям входить в систему с помощью Facebook. Ive удалось реализовать SDK для Android для Android, но им удалось выяснить, как правильно/безопасно аутентифицировать пользователя, который вступает в систему с использованием facebook с учетными данными, полученными только от Facebook. В настоящее время вот моя система:Аутентификация учетных данных, полученных от facebook, на моем собственном REST API

Шаг 1. Из клиента Android пользователь нажимает логин с помощью Facebook и предоставляет разрешения для моего приложения.

Шаг 2. После предоставления пользователя наших разрешений Facebook посылает нам ответ, который включает в себя пользователь Fb идентификатор пользователя, адрес электронной почты и маркер (среди другой информации, если это первый раз, когда пользователь вошел в системе с помощью Facebook)

Шаг 3. Информация отправляется к нашему API для аутентификации

и это, где им немного неясно .... Как я могу проверить на facebook учетные данные на моем сервере?

На данный момент я просто проверяю свой db для существующего пользователя с полученными fb_uid и fb_email, но каждый может получить anyones fb_uid, и ему не так сложно найти электронное письмо, которое они использовали для регистрации в facebook, что означает, что кто-то гипотетически может легко взломать другую учетную запись пользователя с поддельным HTTP-запросом.

ответ

2

access_token, если оно действительное, позволит вам получить доступ к некоторым пользовательским данным Facebook, которые ваше приложение запросило разрешение на доступ. Один из способов проверить правильность получаемых вами учетных данных - это использовать access_token для запроса Facebook.

Например, this page suggests how to open up the access_token properties с помощью GET вызова:

GET graph.facebook.com/debug_token? 
input_token={token-to-inspect} 
&access_token={app-token-or-admin-token} 

который затем возвращает:

{ 
    "data": { 
     "app_id": 138483919580948, 
     "application": "Social Cafe", 
     "expires_at": 1352419328, 
     "is_valid": true, 
     "issued_at": 1347235328, 
     "metadata": { 
      "sso": "iphone-safari" 
     }, 
     "scopes": [ 
      "email", 
      "publish_actions" 
     ], 
     "user_id": 1207059 
    } 
} 
+0

Вы босс яблочный соус мой друг. Большое спасибо, сэр! – ChuckKelly

+0

@Peter - Вы использовали этот подход в производстве? как это с точки зрения производительности? Я предполагаю, что было бы дорого обойтись для каждого запроса API. – jramoyo

+1

@jramoyo: То, что я описываю выше, действительно необходимо, только если вы ошибаетесь (попробуйте использовать разрешения, которых у вас нет). Итак, да, я использовал его в «производстве», но только для обработки ошибок, если токен доступа не делает то, что мы хотим сделать. Это, безусловно, не нужно для всех (любых?) Запросов API (хотя токен доступа для непубличной информации). –