Я написал простую систему аутентификации в Django с помощью Djoser и его реализации JWT. , используя jQuery во внешнем интерфейсе, но я не уверен, правильно ли я это сделал и безопасно ли это.
Сначала, когда пользователь отправляет форму входа, я отправляю POST-запрос на получить токен обновления и токен доступа. Токен обновления хранится в файле cookie или файле cookie сеанса (в зависимости от установленного флажка), а токен доступа хранится в файле cookie сеанса:
Код: Выделить всё
// Post the form
$.post("/auth/jwt/create/", $(this).serialize())
// Success: store tokens & redirect
.done(function(data) {
// Logged in: set redirect path & store tokens
if (data.refresh !== "undefined" && data.access !== "undefined") {
if (remember) Cookies.set("refresh_token", data.refresh, { expires: 30, secure: true, sameSite: "strict" });
else Cookies.set("refresh_token", data.refresh, { secure: true, sameSite: "strict" });
Cookies.set("access_token", data.access, { secure: true, sameSite: "strict" });
}
})
Код: Выделить всё
$("meta[name='csrf-token']").ready(function() {
// Log in or out
function auth(data, access_token) {
$.post("/auth/", {
"user": data,
"access_token": access_token,
"csrfmiddlewaretoken": $("meta[name='csrf-token']").attr("content"),
});
}
// Remove tokens & log out
function logout(reload=true) {
Cookies.remove("refresh_token");
Cookies.remove("access_token");
auth("", "");
}
// Authorize: get user data & log in
function authorize() {
let access_token = Cookies.get("access_token");
$.ajax({
url: "/auth/users/me/",
headers: { "Authorization": "JWT " + access_token },
})
// Success: log in
.done(function(data) { auth(JSON.stringify(data), access_token); })
// Fail: log out
.fail(function() { logout(); });
}
// Refresh access token
function refresh() {
if ("refresh_token" in Cookies.get()) {
$.post("/auth/jwt/refresh/", { "refresh": Cookies.get("refresh_token") })
// Success: store new access token & authorize
.done(function(data) {
Cookies.set("access_token", data.access, { secure: true, sameSite: "strict" });
authorize();
})
// Fail: log out
.fail(function() { logout(); });
}
// No refresh token: log out
else logout();
}
// Verify access token & authorize or refresh
function verify() {
if ("access_token" in Cookies.get()) {
$.post("/auth/jwt/verify/", { "token": Cookies.get("access_token") })
// Success: authorize
.done(function() { authorize(); })
// Fail: refresh access token
.fail(function() { refresh(); });
// No access token: refresh
} else refresh();
}
// Log out page
if (window.location.pathname == "/logout/") {
// Log out & redirect
logout(false);
}
// Attempt login
else verify();
});
р>
Код: Выделить всё
def auth(request):
if not request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest' or not request.method == "POST":
return HttpResponseNotAllowed(["POST"])
user_post = request.POST.get("user")
user = None
if user_post != "" and request.POST.get("access_token") == request.COOKIES.get('access_token'):
user_post = json.loads(user_post)
if "id" in user_post and "username" in user_post and "email" in user_post:
user = User.objects.filter(id=user_post["id"], username=user_post["username"], email=user_post["email"]).first()
if user == None and request.user != None and request.user.is_authenticated:
logout(request)
return HttpResponse("User logged out.")
elif user != None and user != request.user:
login(request, user)
return HttpResponse("User logged in.")
else:
return HttpResponse("No change.")
Подробнее здесь: https://stackoverflow.com/questions/793 ... ion-secure