#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'),
}
})
...
..