Я хочу разработать базу данных аутентификации, которая имеет следующие функции:

  1. Я использовал Bcrypt, поэтому мне нужно сохранить соленый пароль в дБ.
  2. Я разрешаю пользователю входить в систему только на одном устройстве за раз, поэтому мне нужно проверить, вошел ли пользователь в систему в данный момент. (Is_logged_in)
  3. Мне нужно, чтобы пользователи подтвердили свой адрес электронной почты / телефон, прежде чем добавлять их в учетную запись (email_verified, phone_verified)
  4. Я хочу сохранить всю информацию о пользователе (firstName, lastName, dateOfBirth и т. Д.)
  5. Я хочу, чтобы пользователи создали не более трех контрольных вопросов / ответов перед использованием
  6. Я хочу сохранить переданную пользователем информацию о входе в систему (время, местоположение и т. Д.)
  7. Я хочу поделиться этой базой данных между моими несколькими приложениями, то есть использовать одну учетную запись для входа в мои несколько приложений

Итак, я разработал следующие таблицы (первичный ключ выделен жирным шрифтом):

Authentication_Info
UID | Password_salt | Is_logged_in | Email_Verified | Phone_Verified

User_Info
UID | Имя | Фамилия | Электронная почта | Расположение | RegisterDate | PhoneNumber | DateOfBirth | включен

SecurityQ / A
UID | SID | SecurityQuestion | SecurityAnswer

Passed_login_info
UID | Время | Расположение | IP | Устройство

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

Authentication_Info
UID | Password_salt | Is_logged_in

User_Info
UID | Имя | Фамилия | Email_id | Расположение | RegisterDate | Phone_id | Дата рождения

SecurityQ / A
UID | SID | SecurityQuestion | SecurityAnswer

Passed_login_info
UID | PID | Время | Расположение | IP | Устройство

Token_Verification
Verification_id | UID | TempToken | Истекает время

Это хороший дизайн? Какие ошибки я сделал?

1
fredpan 22 Сен 2018 в 23:15

1 ответ

Лучший ответ

Поскольку я не знаком с предполагаемым использованием приложения, я не могу точно сказать, применимы ли приведенные ниже советы в этой ситуации, но, тем не менее, вот несколько предложений:

  1. Что касается таблицы Token_Verification, я считаю, что необходимы только три поля: UID, TempToken, Expire_Time. Я не вижу необходимости в Verification_id.

  2. Таблица Authentication_Info не требует поля для Is_logged_in, потому что мы можем проверить, вошел ли UID в систему, выполнив поиск в таблице Token_Verification действительного TempToken . Таким образом, это поле можно удалить.

  3. Поле Password_salt в таблице Authentication_Info следует разделить на Salt и SaltedHash_Password. Когда пароль поступает на проверку, вам нужно будет добавить соль, хешировать (salt + password) и сравнить с сохраненным значением.

  4. В таблице SecurityQ/A вы должны рассматривать SecurityAnswer, как если бы это был пароль. Каждый ответ безопасности должен храниться с уникальной случайной солью. Таким образом, поля таблицы должны быть UID, SID, SecurityQuestion, Salt, SaltedHash_SecurityAnswer.

Таблицы, которые я не упомянул выше, мне нравятся :)

       (\(\
       ).. \
       \Y_, '-.
         )     '.
         |  \/   \ 
         \\ |\_  |_
         ((_/(__/_,'.
              (,----'
0
Richard Hayes 23 Сен 2018 в 22:46