2015-12-29 5 views
0

В моем приложении iOS при первом запуске пользователь может войти в систему тремя способами: электронной почтой/паролем, Facebook или Twitter. Регистрация с каждым из них приведет к созданию 3 разных пользователей. Позже в моем приложении у пользователя должна быть возможность связать аккаунты. Например, если он выполнил вход с помощью электронной почты/передачи, то он должен уметь связывать Facebook и Twitter.Связать существующий PFUser Facebook и Twitter с Parse on iOS

Parse native -linkInBackground отлично работает, если у нас есть только один пользователь, который является почтой/паролем. Но если у нас уже будет создана учетная запись Facebook или Twitter, Parse SDK ответит с ошибкой, сказав, что эта учетная запись уже связана с социальной. Сначала я думал, что я понял, обходной путь:

  1. Сохранить старые пользовательские данные
  2. Удаление старого пользователя
  3. Войти (не ссылку) с социальным (например, Facebook)
  4. Заполните все данные от сохраненного пользователя до нового.

Все прошло хорошо с одной социальной, но оказалось, что поле «authData», которое очень важно в моем подходе, не содержится в [PFUser currentUser]. И поэтому, несмотря на то, что все другие данные успешно переданы, authData не передается, поэтому у нас нет данных аутентификации старого пользователя.

Вопрос: есть ли способ получить authData из Parse, или есть ли «законный» способ достичь моей первоначальной цели слияния (связывания) двух (трех) пользователей?

ответ

0

Ну, у меня это работает немного по-другому, чем хотелось, но похоже, что это довольно стабильное решение.

Я создал пользовательский класс анализа, называемый, скажем, MyUser. Этот класс имеет несколько полей, например: facebookUser, twitterUser, regularUser, anyOtherSocialUserYouWant. Каждый из них является указателем на класс _User.

Теперь, если мы подписаны, например, как обычный пользователь, создается обычный пользователь. То же самое происходит с остальными, такими как Twitter или Facebook. Присоединившись к трем различным социальным сетям, мы получим трех разных пользователей синтаксического анализа. Это нормально.

Затем, где-то в приложении, пользователь нажмет кнопку «Ссылка на Facebook». Нам нужно сохранить текущего пользователя. Затем мы сделаем запрос для обоих пользователей, если есть объект MyClass с указателями на одного из этих двух пользователей (сначала текущий пользователь, второй - новый пользователь после входа в систему). Если такого объекта MyClass нет, мы создадим его и заполним два поля: regularUser и FacebookUser.

Позже, если пользователь попытается связаться с Twitter, мы сделаем то же самое, и запрос вернет существующий объект MyClass, который будет иметь два поля с указателями для обычных пользователей и пользователей Facebook. Мы просто добавим указатель на нового пользователя, включенного в Twitter, на этот объект MyClass.

Единственный трюк с данными, которые должны быть общими для всех пользователей. Этого достаточно для соответствующего запроса. Нам нужно будет выполнить два запроса (или один запрос «OR», но выглядит так: «OR» не работает с указателями): первый запрос для требуемого объекта с «пользовательским» поле текущего пользователя, а второй запрос (внутренний запрос) для объектов с "linkedUser", равным текущему объекту MyClass.

И, таким образом, для поддержания объектов нам нужно иметь по два поля для каждого объекта: «пользователь» и «linkedUser». Первое поле будет использоваться всегда, а второе поле будет использоваться только после соединения. И да, после создания пользователя MyClass вам нужно будет проверить, имеют ли объекты для текущего пользователя и нового зарегистрированного пользователя эти поля «linkedUser» и заполняют его указателем MyClass в случае, если это поле пуст.

Надеюсь, это поможет кому-то.

P.S .: Уважаемые разработчики Parse.com, я очень ценю вашу работу, но вы действительно должны думать о создании механизма для объединения пользователей.

0

Нет, вы не можете получить доступ к данным auth, так же как вы не можете получить доступ к паролю, когда пользователь аутентифицируется напрямую с помощью электронной почты/передачи. Это требование безопасности и не изменится.

В идеале вы должны добавить логику, которая проверяет, должен ли быть создан новый пользователь или если пользователь с указанными данными (возможно, адрес электронной почты) уже существует. Если это произойдет, вы можете отклонить создание нового пользователя и вернуть предложение о том, как пользователь должен войти в систему.

+0

Я понимаю это, но есть ли способ обходного пути? Вопрос довольно распространен, и я не видел много подобных вопросов без ответа. – lonlywolf

+0

Поскольку вы не можете получить доступ к данным, вы не можете объединить учетные записи пользователей. Обсудите с синтаксисом, если вы хотите, чтобы это сделать. В противном случае вам необходимо запретить пользователям делать это или каким-либо образом связать пользователей с группой. – Wain

+0

Это проблема, с которой я столкнулся, и я не нашел окончательного решения во всех потоках чтения. Как мы можем связать существующий PFUser с пользователем Facebook? Различные методы «ссылки» работают с PFUser.currentUser(), но (по крайней мере, в моем случае) всегда терпят неудачу, когда я предоставляю пользователю запрос из таблицы «Пользователи». Зачем? Самое близкое, что я могу получить, это создать нового пользователя и скопировать данные из моего существующего пользователя (того, который найден в таблице «Пользователи»). Но это не будет работать с пользователями, созданными при регистрации имени пользователя и пароля, так как я не могу скопировать пароль. Невероятно разочаровывает. – mrwheet