Как обращаться с пользователями, которые не помнят, зарегистрировались ли они через Facebook ИЛИ Google в моем приложении?

Я работаю над приложением, которое позволяет пользователям регистрироваться либо вручную с помощью комбинации электронной почты и пароля, либо через facebook ИЛИ регистрацию в Google.

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

Моя проблема возникает, когда пользователь, скажем, удалил приложение и переустановил его, а затем забывает, зарегистрировался ли он через facebook или google. Допустим, они изначально зарегистрировались с помощью Facebook, а теперь, после переустановки, нажимают кнопку входа через Google. Теперь, когда серверная часть получает новый токен Google и я его проверяю, я получаю идентификатор пользователя от Google. Поскольку этот идентификатор отличается от исходного идентификатора пользователя, зарегистрировавшегося через facebook, технически это совершенно другой пользователь. Кроме того, поскольку адрес электронной почты исходного пользователя уже сохранен в базе данных, я не могу создать дубликата пользователя с тем же адресом электронной почты.

Как правильно поступить в этой ситуации? Должен ли пользователь показывать информационную ошибку, говорящую ему, что он изначально зарегистрировался через Facebook, и он должен использовать это?


person sudoExclaimationExclaimation    schedule 18.01.2017    source источник
comment
После входа в систему через Google / FB получите данные пользователя, такие как адрес электронной почты, имя и т. Д. Войдите в систему с помощью этих учетных данных. Если в следующий раз войдите в систему любым другим способом, проверьте, существует ли идентификатор электронной почты в БД или нет, если он существует, войдите в систему с помощью этого идентификатора электронной почты; с помощью которого вход пользователя через google/fb или метод id будет одинаковым.   -  person Sagar Shirbhate    schedule 18.01.2017


Ответы (1)


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

person Marcus    schedule 18.01.2017
comment
У меня есть отдельный столбец, который представляет собой поле UUID, предназначенное специально для использования моим приложением. Как мне сопоставить одного и того же пользователя из facebook с тем же пользователем из google? Например, в настоящее время у меня есть столбец с именем auth_id, в котором хранится идентификатор третьей стороны, и другой столбец с именем userid, который является моим идентификатором в приложении. Должен ли я иметь что-то еще? - person sudoExclaimationExclaimation; 18.01.2017
comment
Вместо того, чтобы иметь один и тот же столбец для идентификатора facebook и google, просто создайте отдельный столбец для каждого, например facebook_id и google_id. - person Marcus; 18.01.2017
comment
Вы также получаете токен доступа или что-то в этом роде, чтобы получать данные о пользователе из facebook и google, верно? это также должно быть сохранено в отдельных столбцах, facbook_token и google_token. Ничто не мешает вам разрешить пользователям подключать свои учетные записи facebook и google к одной учетной записи в вашем приложении. Вы можете сопоставить их адрес электронной почты, чтобы найти правильный аккаунт. - person Marcus; 18.01.2017
comment
в порядке. даже если у меня есть отдельные столбцы, я все еще не понимаю, как, когда пользователь входит в систему через Google, мой сервер может каким-то образом выяснить, что этот пользователь такой же, как и другой пользователь, который зарегистрировался через Facebook. Я мог бы связать его с помощью адреса электронной почты, который будет одинаковым для обеих учетных записей, но это проблема безопасности, поскольку любой может подписать кого-то другого через свою электронную почту Google. - person sudoExclaimationExclaimation; 18.01.2017
comment
Допустим, они регистрируются в Facebook. Вы создаете новую строку со своим уникальным идентификатором, идентификатором Facebook и адресом электронной почты. Затем, когда они входят в систему с помощью Google, вы можете проверить существующую учетную запись, сопоставив адрес электронной почты. Если они не дадут вам свой адрес электронной почты, вы не сможете узнать, есть ли у них учетная запись в вашем приложении или нет. - person Marcus; 18.01.2017
comment
из моего исследования я обнаружил, что хранение учетных записей доступа к facebook и google не рекомендуется. security.stackexchange.com/questions/72475/ - person sudoExclaimationExclaimation; 18.01.2017
comment
@PranoyC, вы можете обновить эту строку базы данных, если пользователь переходит из другого социального пути. - person Yatendra; 18.01.2017
comment
Ну, вы должны сохранить токен в безопасности и проверить, не истек ли срок его действия. Я уверен, что на страницах разработчиков facebook и google есть инструкции о том, как это сделать. - person Marcus; 18.01.2017
comment
да, но это открывает дыру в безопасности, не так ли? например, скажем, у Боба на самом деле нет учетной записи facebook. Боб регистрируется в моем приложении через Google. Мэлори (злонамеренная сторона) регистрирует Боба в Facebook через электронную почту Боба на gmail. Теперь Мэлори может зайти в мое приложение и войти в систему с этой учетной записью Facebook. Теперь, поскольку вы предлагаете сопоставить данные по электронной почте, Мэлори может видеть данные Боба. Это проблема безопасности, не так ли? - person sudoExclaimationExclaimation; 18.01.2017
comment
Я думаю, вам не нужно хранить предыдущие социальные токены, если да, то почему? - person Yatendra; 18.01.2017
comment
Ну, вы не можете позволить им вручную вводить адрес электронной почты при входе через службы единого входа. Вы получаете их электронную почту после того, как они аутентифицируются через Google или Facebook. Таким образом, Мэлори должен знать пароль Боба на Facebook, чтобы иметь возможность войти в систему с его электронной почтой. - person Marcus; 18.01.2017
comment
@Yatendra да, у меня есть еще один столбец auth_type, который сообщает мне, какой социальный путь зарегистрировал пользователь. хранение токена возможно, но в этой ситуации это все равно не помогает. Проблема в том, как сопоставить пользователя google с пользователем facebook. - person sudoExclaimationExclaimation; 18.01.2017
comment
вы можете сопоставить этого пользователя с идентификатором электронной почты, потому что fb и google возвращают идентификатор электронной почты - person Yatendra; 18.01.2017
comment
Процесс должен быть таким: Боб решает войти в систему через facebook --> он перенаправляется на страницу входа в facebook --> он вводит свои учетные данные --> он перенаправляется обратно на ваш сайт вместе с токеном --> вы используете токен, чтобы получить его электронная почта -> сохранить в базе данных. Процесс может немного отличаться в зависимости от sso-service, но вы поняли идею. - person Marcus; 18.01.2017
comment
@ Маркус, извини, я имел в виду другое. Я имею в виду, что, поскольку у Боба нет учетной записи facebook, любой может зайти на facebook и создать учетную запись, указав адрес электронной почты Боба. Facebook отправляет электронное письмо с подтверждением на электронную почту Боба, но это не мешает Мэлори продолжать использовать эту учетную запись Facebook для регистрации в моем приложении. API-интерфейсы facebook и google имеют проверенный атрибут true/false, который я проверяю. - person sudoExclaimationExclaimation; 18.01.2017
comment
@Маркус, не мог бы ты присоединиться к чату? это становится немного длинным для комментариев. Я ценю его. - person sudoExclaimationExclaimation; 18.01.2017
comment
Что ж, если Мэлори может создать учетную запись Facebook с электронной почтой Боба, фактически не имея доступа к этой электронной почте, это серьезная дыра в безопасности FACEBOOK, и я сомневаюсь, что это так. - person Marcus; 18.01.2017
comment
@Маркус, да, я тоже так думал, но если вы погуглите facebook, кто-то другой использовал мою электронную почту, вы найдете много таких случаев. вот почему я немного смущен - person sudoExclaimationExclaimation; 18.01.2017
comment
@Marcus вот этот, например: facebook.com/help/community/question/ ?id=808750535838219 - person sudoExclaimationExclaimation; 18.01.2017
comment
Я действительно не думаю, что вы можете что-то сделать с этим в этом случае, и я не думаю, что есть какой-либо другой способ сопоставить учетные записи, кроме как по электронной почте. По крайней мере, так я сделал, когда делал подобное приложение некоторое время назад. - person Marcus; 18.01.2017
comment
Давайте продолжим обсуждение в чате. - person Marcus; 18.01.2017