Ситуация
У меня есть настольное клиентское приложение 'C' и серверное приложение 'S', написанные на C ++, которые находятся на разных компьютерах.В настоящее время они общаются через TCP.Чувствительные пользовательские данные хранятся в «S».
Текущий поток входа в систему следующий: пользователь вводит свои учетные данные в «C», они отправляются в зашифрованном виде в «S», «S» сравнивает ихс учетными данными, которые он имеет в специальной базе данных «D» для этого пользователя.Если учетные данные действительны, S предоставляет клиенту специфичные для пользователя данные.В противном случае в соединении будет отказано.Регистрация новых пользователей осуществляется через централизованный веб-сервер », который отправляет учетные данные в« S », и они помещаются в« D ».
Проблема
Я хочу, чтобы пользователи клиента быливозможность войти через Facebook с помощью кнопки «Войти через Facebook» на текущем экране входа (в настоящее время у меня есть только пользователь и пароль).Мне нужен только логин, никакой другой интеграции.Я буду использовать номер FacebookID пользователя в качестве идентификатора в базе данных D.
Решение
Я прочитал документацию Facebook , и они рекомендуют встраивать сетьв браузере клиента откройте специальный диалог авторизации, передавая идентификатор вашего приложения, а затем прослушайте изменение URI, чтобы получить от него токен доступа (это описано в конце вышеприведенной документации).Это именно то, что я планирую сделать.У меня уже есть веб-браузер, встроенный в клиент.Он откроет там диалог аутентификации, прослушает изменение URI в коде C ++ и получит токен доступа из URI.Затем клиент отправит токен доступа на сервер «S».«S» отправит HTTP-запрос в Facebook, передав маркер доступа, и Facebook ответит личными данными пользователя.«S» читает FacebookID пользователя и помещает его в базу данных пользователей «D», если его там еще нет.Если он уже есть, клиент получает конфиденциальные данные, специфичные для пользователя.
Альтернативные решения
- Используйте локальный браузер компьютера пользователя для открытия диалога Facebook вместо диалогового окна Facebook.встроенный (пользователь будет чувствовать себя в большей безопасности).Facebook перенаправит браузер пользователя на сервер «S», передав ему токен доступа.В этом случае я должен сделать прослушиватель 'S' HTTP (поместите на него веб-сервер C ++).Проблема здесь в том, что Facebook разрешает перенаправление только на заранее определенные домены (перечисляются заранее), и каждый раз, когда я хочу протестировать с другим сервером 'S' (довольно часто), мне придется вводить его в элемент управления приложения Facebookпанель.
- Использовать текущий текущий веб-сервер, о котором я упоминал в начале.Я перенаправлю локальный браузер пользователя на этот веб-сервер, который запустит серверную логику PHP для перехода пользователя в диалоговое окно авторизации, получения токена доступа и передачи его S, который получит от него FacebookID.
В решениях 1 и 2 клиент также должен будет передать ClientID, чтобы сервер мог идентифицировать его при попытке подключения.
Мой вопрос
Как вы думаете, мое решениехорошо и достаточно безопасно по сравнению с другими решениями?Безопасно ли передавать токен доступа с клиента на сервер?Видите ли вы другие потенциальные проблемы с моим решением?
Заранее спасибо