Ответ 1
Все идеи, которые вы описываете, выглядят действительно для меня, но все описание выглядит неполным.
Отсутствующие части:
- Как вы храните и идентифицируете пользователей?
- Как вы храните auth tokens?
- Может ли один пользователь иметь несколько токенов?
- Вы хотите просрочить старые токены?
У вас уже есть описание двух процессов: регистрация новых пользователей по электронной почте и регистрация новых пользователей через facebook.
На сервере я бы сохранил их вот так, users
table:
- ID - целое число, уникальный идентификатор пользователя в базе данных приложения
- email - строка, необязательная (может отсутствовать для facebook), уникальная в таблице
- facebook_id - строка, необязательная (будет отсутствовать для пользователей, зарегистрированных по электронной почте), уникальная в таблице
- пароль - строка, необязательная (нет пароля для пользователей facebook)
И я бы также объединил пользователей электронной почты /facebook в таких сценариях, как это:
- Пользователь регистрируется с помощью электронной почты, у нас есть идентификатор и адрес электронной почты.
- Пользователь регистрирует/регистрируется с помощью facebook и предоставляет электронную почту
- Мы проверяем, что пользователь с такой электронной почтой уже существует и устанавливает для него facebook_id.
- Теперь пользователь может войти в систему как с facebook, так и по электронной почте
Если пользователь меняет адрес электронной почты в facebook - это ничего не нарушает, мы можем просто игнорировать это изменение, если у нас уже есть письмо в таблице users
. Таким образом, пользователь может войти в систему со своим старым письмом. (Или, используя дополнительную историю входа в систему, мы можем проверить, что пользователь никогда не вошел в систему с электронной почтой и не заменил его новым).
Также легко обеспечить функцию generate password
для пользователей facebook. Они могут вводить электронную почту и генерировать пароль при входе в систему, поэтому в будущем они могут также войти в систему с помощью электронной почты/пароля.
Также вы можете добавить функцию forgot password
, которая может сгенерировать новый пароль и отправить его пользователю электронной почты - это может использоваться как пользователями email
, так и теми facebook
, которые предоставили электронное письмо.
Если я правильно поняла вашу идею, вы хотите иметь единый унифицированный метод для создания новых пользователей и аутентификации существующих пользователей, например:
- Пользователь вводит и приложение отправляет на сервер адрес электронной почты и пароль
- Проверьте, существует ли пользователь с таким адресом электронной почты
- Пользователь существует - проверьте пароль
- Прошел - отправьте токен доступа
- Сбой - отправьте сообщение об ошибке
- Пользователь не существует - создайте нового пользователя и токен
- Отправить токен доступа
Это похоже на facebook, но вместо электронной почты/пароля мы проверяем facebook_id и проверяем с запросом в facebook.
Вы также можете рассмотреть возможность наличия отдельных конечных точек бэкэнд - для регистрации новых пользователей и для входа в систему существующих пользователей. Поскольку в соответствии с вышеописанной процедурой, если пользователь неправильно вводит свой адрес электронной почты, вы создадите нового пользователя, которого не ожидается. Для регистрации/входа в facebook, вероятно, не будет иметь большого значения.
Я предполагаю, что полезно разрешить одному пользователю иметь несколько токенов auth для входа из разных мест, поэтому вот таблица tokens
:
- ID - целое число, уникальный идентификатор, первичный ключ
- токен - строка, уникальный токен доступа (вы можете считать его основным ключом)
- user_id - целое число, ссылка на пользователя, которому принадлежит токен
- created_at - дата, дата создания
- expired - boolean, может использоваться для истечения срока годности токенов.
Обычный запрос выглядит следующим образом:
- Есть запрос с X-auth_token
- Найти маркер в базе данных
- Найти подходящего пользователя
- Разрешить пользователю доступ к своим ресурсам.
Выдача токена может быть выполнена следующим образом:
- Есть запрос с X-auth_token
- Найти маркер в базе данных
- Проверьте, если
now() - token.created_at > EXPIRATION_PERIOD
- отметьте токен как истек (
token.expired
= True + save) - вернуть ошибку "Истек срок действия"
- в следующих запросах - вернуть ту же ошибку, приложение должно попросить пользователя снова войти в систему
- отметьте токен как истек (