Интеграция входа в facebook в настольное клиент-серверное приложение.

Ситуация

У меня есть настольное клиентское приложение «C» и серверное приложение «S», написанные на C ++ и находящиеся на разных машинах. В настоящее время они общаются через TCP. Конфиденциальные пользовательские данные хранятся на букве «S».

Текущий поток входа следующий: пользователь вводит свои учетные данные в 'C', они отправляются в зашифрованном виде на 'S', 'S' сравнивает их с учетными данными, которые он имеет в специальной базе данных 'D' для этого пользователя. . Если учетные данные действительны, S предоставляет клиенту данные для конкретного пользователя. В противном случае в соединении будет отказано. Регистрация новых пользователей осуществляется через централизованный веб-сервер, который отправляет учетные данные на «S», и они помещаются в «D».

Проблема

Я хочу, чтобы пользователи клиента могли входить в систему через Facebook с помощью кнопки «Войти через Facebook» на текущем экране входа (в настоящее время у меня есть только User и Pass). Мне нужен только логин, никакой другой интеграции. Я буду использовать номер FacebookID пользователя в качестве идентификатора в базе данных D.

Решение

Я прочитал документацию Facebook , и они рекомендуют встроить веб-браузер в клиент, открыть специальный диалог аутентификации, в котором передается идентификатор вашего приложения, а затем выполняется прослушивание изменения URI, чтобы получить от него токен доступа (это описано в конце приведенной выше документации). Это именно то, что я планирую сделать.У меня уже есть встроенный в клиент веб-браузер. Он откроет там диалоговое окно аутентификации, прослушает изменение URI в коде C ++ и получит токен доступа из URI. Затем клиент отправит токен доступа на сервер «S». «S» отправит HTTP-запрос к Facebook, передав токен доступа, и Facebook ответит личными данными пользователя. «S» считывает FacebookID пользователя и помещает его в пользовательскую базу данных «D», если его там еще нет. Если он уже существует, клиенту предоставляются конфиденциальные пользовательские данные.

Альтернативные решения

  1. Используйте локальный браузер на компьютере пользователя для открытия диалогового окна Facebook вместо встроенного (таким образом пользователь будет чувствовать себя более защищенным). Facebook перенаправит браузер пользователя на сервер S, передав токен доступа непосредственно ему. В этом случае мне нужно сделать HTTP-прослушиватель «S» (поставить на него веб-сервер C ++). Проблема здесь в том, что Facebook допускает перенаправление только на предопределенные домены (перечисленные заранее), и каждый раз, когда я хочу протестировать с другим сервером «S» (довольно часто), мне придется вводить его в элемент управления приложения Facebook. панель.
  2. Используйте текущий текущий веб-сервер, о котором я упоминал в начале. Я перенаправлю локальный браузер пользователя на этот веб-сервер, который будет запускать логику PHP на стороне сервера для перехода пользователя в диалоговое окно аутентификации, получения токена доступа и передачи его S, который получит от него FacebookID.

В решениях 1 и 2 клиент также должен будет передать ClientID, чтобы Сервер мог идентифицировать его при попытке подключения.

Мой вопрос

Считаете ли вы мое решение хорошим и достаточно безопасным по сравнению с другими решениями? Безопасно ли передавать токен доступа от клиента к серверу? Видите ли вы другие потенциальные проблемы с моим решением?

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

7
задан Stoyan 10 December 2011 в 12:28
поделиться