Проверка подлинности Facebook на моем сервере с помощью Android

Я создаю приложение со следующими блоками:

Android - клиентская сторона, Java Servlets - Sever Side, Facebook - используется для аутентификации пользователей и работы с их данными.

Моя проблема в следующем: Я хотел бы аутентифицировать своих пользователей через facebook (например, запрос, отправленный клиентом android с помощью facebook-android-sdk в facebook), но затем я хотел бы отправлять запросы на мой сервер (который реализуется сервлетами) и как-то проверять что пользователь, отправляющий запрос, аутентифицируется в facebook и моем приложении.

Итак, это шаги:

пользователь X аутентифицируется в facebook и моем приложении facebook, используя facebook-android-sdk. X отправляет запрос на мой сервер

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

Как я могу узнать, что X действителен на моем сервере? В этом случае аутентификация выполнялась на стороне клиента.

Ответ 1

Итак, у вас есть: Facebook - приложение для Android - ваш веб-сервер. И ваш веб-сервер должен знать, что вы являетесь пользователем Facebook, которого вы представляете. Проблема в том, что вы не можете доверять клиенту Android за любые данные, которые он вам дает.

Я решил проблему следующим образом:

  • Аутентификация пользователя Facebook из приложения Android,
  • Получить токен FB auth для приложения Android,
  • Переслать токен аутентификации и идентификатор facebook с Android на веб-сервер,
  • На веб-сервере сделайте вызов Facebook API с предоставленным токеном.

Если вызов Facebook API с веб-сервера возвращает действительную проверку подлинности, а идентификатор пользователя равен тому, который был отправлен приложением Android, ваш сервер может доверять id (и вы можете быть уверены, что подлинность Android действительно)

Ответ 2

Лучший ответ на этот вопрос (включая информацию из комментария tomas.tunkl) выглядит следующим образом:

  • Аутентификация из приложения Android
  • Получить токен FB Auth из аутентификации в приложении
  • Переслать идентификатор токена и fb на веб-сервер
  • Вызовите конечную точку отладки, как описано здесь (https://developers.facebook.com/docs/facebook-login/access-tokens/debugging-and-error-handling) - это даст вам идентификатор приложения, сгенерировавшего маркер. УБЕДИТЕСЬ, что идентификатор приложения - это ваш идентификатор APP (это означает, что это токен из вашего мобильного приложения), в противном случае кто-то захватывает ваше приложение, используя токен из другого приложения, и вы пропускаете данные пользователя (поскольку thomas tunkl указал на url https://developers.facebook.com/docs/facebook-login/security/#tokenhijacking). Это плохо. Также проверьте is_valid/expires_at, чтобы убедиться, что он по-прежнему является действительным маркером из вашего приложения.

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

При работе с токеном доступа вам может потребоваться проверить, какая информация связана с ним, например, его пользователь или истечение срока действия. Чтобы получить эту информацию, вы можете использовать наш инструмент отладки или вы можете использовать конечную точку API.

Чтобы использовать API, вы можете выдать запрос API Графа:

GET /debug_token? input_token={input-token}& access_token={access-token}

input_token: токен доступа, который вы хотите получить информацию о

access_token: токен доступа к вашему приложению или действительный токен доступа пользователя от разработчика приложения Ответ вызова API представляет собой массив JSON, содержащий карту полей. Например:

{ "data": { "app_id": 000000000000000, "application": "Social Cafe", "expires_at": 1352419328, "is_valid": true, "issued_at": 1347235328, "scopes": [ "email", "publish_actions" ], "user_id": 1207059 } }

Обратите внимание, что поле issu_at не возвращается для токенов доступа с коротким сроком действия.

Это гарантирует, что у вас есть действительный токен для пользователя facebook, который был создан из вашего секретного ключа для пользователя; что они правильно аутентифицировались.