实施 "Remember Me" Django
Implement "Remember Me" Django
我目前正在尝试在 Django 中实现 "Remember Me" 功能。
我正在使用来自 Django REST 框架的 SessionAuthentication
和来自 djangorestframework-jwt 的 JSONWebTokenAuthentication
。
但是,我不知道如何为这两个身份验证实现"Remember Me"的概念。比如我如何永远扩展会话以及如何永远扩展令牌(我正在为移动和桌面使用 JWT 身份验证 - 浏览器的会话身份验证)。
此外,为这两种身份验证实现此功能的安全方法是什么?
这里有几件事我应该提前说明:身份验证的工作原理以及 SessionAuthentication
和 JSONWebTokenAuthentication
.
的过期时间。
会话验证
Django REST 框架提供的 SessionAuthentication
class 实际上只是 session framework provided by Django 之上的一小层。所以如果你可以在 Django 中使用他们的会话实现一个 "remember me" 函数,DRF 也会继承它。
幸运的是,已经有人在 Stack Overflow 上询问过这个问题:Django “Remember Me” with built-in login view and authentication form
基本上它归结为将 the SESSION_COOKIE_AGE
setting(默认为 2 周)更改为一个非常高的数字。还要确保牢记长期会话的含义,并可能检查您访问的网站上默认的会话 cookie 的时长(通常为 2 周到 6 个月)。
JSON 网络令牌
django-rest-framework-jwt 提供的 JSONWebToken
身份验证 class 根据 JSON Web 令牌对请求进行身份验证。默认情况下,令牌会在 5 分钟后过期,但最多可以刷新 7 天。
令牌过期时间由JWT_EXPIRATION_DELTA
设置控制。不建议将此时间延长得太长,而是 use refresh tokens 用于长期令牌。您可以使用 JWT_ALLOW_REFRESH
设置启用刷新令牌,并使用 JWT_REFRESH_EXPIRATION_DELTA
设置控制到期时间。
在设置文件中你必须设置:
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
在模板中:
提供一个复选框,name="remember_me" value="1"
在登录函数(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)
以下代码用于用户认证。这里 'is_remember_check' 来自 HTML 文件
的复选框字段
@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 中实现 "Remember Me" 功能。
我正在使用来自 Django REST 框架的 SessionAuthentication
和来自 djangorestframework-jwt 的 JSONWebTokenAuthentication
。
但是,我不知道如何为这两个身份验证实现"Remember Me"的概念。比如我如何永远扩展会话以及如何永远扩展令牌(我正在为移动和桌面使用 JWT 身份验证 - 浏览器的会话身份验证)。
此外,为这两种身份验证实现此功能的安全方法是什么?
这里有几件事我应该提前说明:身份验证的工作原理以及 SessionAuthentication
和 JSONWebTokenAuthentication
.
会话验证
Django REST 框架提供的 SessionAuthentication
class 实际上只是 session framework provided by Django 之上的一小层。所以如果你可以在 Django 中使用他们的会话实现一个 "remember me" 函数,DRF 也会继承它。
幸运的是,已经有人在 Stack Overflow 上询问过这个问题:Django “Remember Me” with built-in login view and authentication form
基本上它归结为将 the SESSION_COOKIE_AGE
setting(默认为 2 周)更改为一个非常高的数字。还要确保牢记长期会话的含义,并可能检查您访问的网站上默认的会话 cookie 的时长(通常为 2 周到 6 个月)。
JSON 网络令牌
django-rest-framework-jwt 提供的 JSONWebToken
身份验证 class 根据 JSON Web 令牌对请求进行身份验证。默认情况下,令牌会在 5 分钟后过期,但最多可以刷新 7 天。
令牌过期时间由JWT_EXPIRATION_DELTA
设置控制。不建议将此时间延长得太长,而是 use refresh tokens 用于长期令牌。您可以使用 JWT_ALLOW_REFRESH
设置启用刷新令牌,并使用 JWT_REFRESH_EXPIRATION_DELTA
设置控制到期时间。
在设置文件中你必须设置:
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
在模板中:
提供一个复选框,name="remember_me" value="1"
在登录函数(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)
以下代码用于用户认证。这里 'is_remember_check' 来自 HTML 文件
的复选框字段@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>