Как сохранить вход пользователя в систему с помощью Django Rest Framework?

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Я новичок в Django из мира Firebase, где аутентификация и сохранение входа пользователя в систему очень просты.

В изучении Django (Rest Framework) Я узнал, что вы можете войти в систему пользователя, получить токен и сохранить токен в файлах cookie для повторного использования в следующий раз, когда тот же пользователь зайдет на веб-сайт. Это лучший способ сохранить вход пользователя в систему?

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

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

Я очень смущен тем, как работает аутентификация / вход в систему.

Ответ №1:

Обычный способ справиться с этой проблемой — использовать Jwt auth.

Вы будете выдавать своему потребителю токен с коротким сроком службы вместе с токеном обновления с длительным сроком службы.

https://github.com/jpadilla/django-rest-framework-jwt

На вашей стороне интерфейса вы можете реализовать механизм автоматического обновления по истечении срока действия токена.

Пример с React: https://medium.com/@monkov/react-using-axios-interceptor-for-token-refreshing-1477a4d5fc26

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

Ответ №2:

Каждый запрос является анонимным / новым, даже после входа в систему.

Почему я сохраняю loggedin?

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

Что такое токен?

Существует много видов токенов: токен сеанса, jwt, базовый токен… Токен — это строка вашего идентификатора, а jwt (веб-токены JSON) — одно из самых популярных решений для аутентификации (CORS). Вот как выглядит оригинальный jwt:

 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
  

И вот как выглядят фактические данные jwt:

 # HEADER:ALGORITHM
{ 
  "alg": "HS256",
  "typ": "JWT"
}
# PAYLOAD:DATA
{ 
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
# VERIFY SIGNATURE
HMACSHA256(
  base64UrlEncode(header)   "."  
  base64UrlEncode(payload),
  your-256-bit-secret
)
  

Где мне хранить токен

Токен — это хранилище в ваших локальных файлах cookie. Для каждого запроса вы можете получить токен из локальных файлов cookie и добавить в заголовок запроса. Например, в React:

 import Cookies from "universal-cookie"

localCookies = new Cookies();
...
..
fetch(`/api/logs/:id`, {
            headers: {
                'Content-Type': 'application/json',
                'Authorization': 'JWT '   localCookies.get('token'),
            }
        })
...
..