实施“记住我”Djang

2024-05-20 00:39:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正试图在Django中实现“记住我”功能。

我同时使用Django REST framework的SessionAuthentication和djangorestframework jwt的JSONWebTokenAuthentication

但是,我不知道如何为这两个身份验证实现“记住我”的概念。比如我如何永远扩展会话,如何永远扩展令牌(我使用JWT auth for mobile&;desktop-session auth for browser)。

另外,对于这两种身份验证,实现此功能的安全方法是什么?


Tags: django功能auth身份验证rest概念forframework
3条回答

在设置文件时,必须设置:

SESSION_EXPIRE_AT_BROWSER_CLOSE = True

在模板中:

提供一个名为“记住我”值为“1”的复选框

在login函数(view.py或ajax.py)中,当用户名和密码匹配时编写此代码

try:
    remember = request.POST['remember_me']
    if remember:
        settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False
except MultiValueDictKeyError:
    is_private = False
    settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True

依赖关系

from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth import authenticate
from site_user.models import User

当我们进入登录页面时,此代码将从会话中撤消用户名和密码

def home(request):
    if request.session.has_key('username') and request.session.has_key('password'):
        username = request.session['username']
        password = request.session['password']
        context_dict = {'username': username, 'password': password}
        return render(request, 'sadmin/login.html', context=context_dict)
    else:
        context_dict = {'username': '', 'password': ''}
        return render(request, 'sadmin/login.html', context=context_dict)

以下代码用于用户身份验证。这里是HTML文件中的“is_remember_check”复选框字段

@csrf_exempt
def login(request):
    if request.method == "POST":
        if request.POST['is_remember_check'] == 'true':
            request.session['username'] = request.POST['username']
            request.session['password'] = request.POST['password']

        user = authenticate(username=request.POST['username'], password=request.POST['password'])

        if user is not None:
            return JsonResponse({'result': request.POST, 'status': True})
        else:
            return JsonResponse({'result': request.POST, 'status': False})

登录页面中的AJAX调用

function login(){
    remember_checkbox_value = document.getElementsByName('remember')[0].checked;
    username = document.getElementsByName('username')[0].value;
    password = document.getElementsByName('password')[0].value;
    var post_data = {username:username, password:password, is_remember_check:remember_checkbox_value};

    $.ajax({
                url: '/sadmin/login/',
                method: 'POST',
                data: post_data,
                dataType: 'json',
                success: function (response) {
                        if (response.status){
                        alert("User login is successful");
                        window.location.reload();
                        }
                        else{
                        alert("User login is not successful");
                        window.location.reload();
                        }
                }
        });
}

HTML代码

<div class="form-actions">
            <label class="checkbox">
            <input type="checkbox" name="remember"/> Remember me </label>
            <button type="button" class="btn green-haze pull-right" onclick="login()">Login <i class="m-icon-swapright m-icon-white"></i>
            </button>
        </div>

这里有几件事我应该提前说明:身份验证是如何工作的,过期在哪里起作用。

会话身份验证

Django REST框架提供的SessionAuthentication类实际上只是session framework provided by Django上的一个小层。因此,如果您可以在Django中使用它们的会话实现一个“记住我”函数,DRF也将继承它。

幸运的是,已经有人在堆栈溢出时询问了这个问题:Django “Remember Me” with built-in login view and authentication form

基本上可以归结为将the ^{} setting(默认为2周)更改为一个非常高的数字。另外,请务必记住长时间会话的含义,也许可以在您访问的网站(通常是2周到6个月)上查看默认会话cookie的时间。

JSON Web令牌

django-rest-framework-jwt提供的JSONWebToken身份验证类基于JSON Web令牌对请求进行身份验证。默认情况下,令牌在5分钟后过期,但最多可以刷新7天。

令牌过期时间由JWT_EXPIRATION_DELTA设置控制。建议不要将此时间延长到太大,而应该将use refresh tokens用于长寿命令牌。您可以使用JWT_ALLOW_REFRESH设置启用刷新令牌,并使用JWT_REFRESH_EXPIRATION_DELTA设置控制过期时间。

相关问题 更多 >