Создание записи пользователя / профиля для первого входа - PullRequest
1 голос
/ 07 марта 2019

Я использую сервис аутентификации Auth0, чтобы разрешить пользователям входить в мое приложение.Приложение представляет собой платформу вопросов и ответов, очень похожую на stackoverflow.Я храню профиль пользователя на моем сервере с такой информацией, как: «обо мне», голосами, предпочтениями и т. Д.

Когда новый пользователь входит в систему, мне нужно сделать 1 из 2 вещей:

  1. Для существующего пользователя - получить профиль пользователя с моего сервера API
  2. Для нового пользователя - создать новый профиль в базе данных

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

Это не сложная проблема, но было бы хорошо понять лучшие практики.Я могу придумать 2 менее чем идеальных способа справиться с этим:

** Решение 1 - запрос GET **

  • Отправить запрос get на сервер api, передав уникальный идентификатор
  • Если запись найдена, верните ее
  • В противном случае создайте новый профиль в БД и верните новый профиль

Это кажется неверным, поскольку запрос GET не должен записываться всервер.

** Решение 2 - Один GET и условный POST-запрос **

  • Отправьте запрос get на сервер API, передав уникальный идентификатор
  • сервер проверяет базу данных и возвращает профиль или сообщение об ошибке
  • Если сервер API возвращает сообщение об ошибке, отправьте запрос на создание нового профиля
  • В противном случае перенаправьте на домашнюю страницу

Это кажется неэффективным, потому что нам нужно 2 запроса для достижения простого результата.

Кто-нибудь может пролить свет на лучшую практику?

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Кажется, что есть некоторые разногласия по поводу лучшего подхода и некоторые интересные тонкости, которые обсуждались в этом посте: REST Lazy Reference Создать GET или POST?

Пожалуйста, прочитайте весь пост, но я склоняюсь к @Cormac Mulhall и @Blake Mitchell:

Клиент хочет узнать текущее состояние ресурса с сервера. Он не знает, что это может означать создание ресурса, и ему совершенно безразлично, что это первый раз, когда кто-то пытался получить этот ресурс раньше, или что сервер должен создавать ресурс на его конце.

Следующая цитата из RESTful поваренная книга , предоставленная @Blake Mitchell, делает тонкое различие, которое также поддерживает точку зрения Малхолла:

Что такое идемпотентные и / или безопасные методы? Безопасные методы - это методы HTTP, которые не изменяют ресурсы. Например, используя GET или HEAD для URL ресурса, НИКОГДА не изменяйте ресурс. Однако это не совсем так. Это означает: это не изменит представление ресурса. Все еще возможно, что безопасные методы изменяют вещи на сервере или ресурсе, но это не должно отражаться в другом представлении.

Наконец, это ключевое различие сделано в Разделе 9.1.1 спецификации HTTP :

Естественно, невозможно гарантировать, что сервер не генерировать побочные эффекты в результате выполнения запроса GET; в На самом деле, некоторые динамические ресурсы считают эту функцию. важный Различие здесь в том, что пользователь не запрашивал побочные эффекты , поэтому не может быть привлечен к ответственности за них.

Возвращаясь к первоначальному вопросу, кажется, что приведенное выше поддерживает решение 1, которое заключается в создании профиля на сервере, если он еще не существует.

1 голос
/ 08 марта 2019

Есть дополнительная опция. Вы можете использовать правило в Auth0 для отправки POST на конечную точку /users/create на вашем API-сервере, когда пользователь впервые входит в систему, предполагая, что пользовательская база данных в Auth0 и в вашем приложение обновлено.

Это будет выглядеть примерно так:

[...]

var loginCount = context.stats.loginsCount;

if (loginCount == 1) {
  // send POST to your API and create the user
  // most likely you'll want to await for response before moving on with the login flow
}

[...]

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

...