Django中的HTTP Basic身份验证

2023-04-11 00:00:00 django http 身份验证

HTTP Basic认证是一种简单的身份验证机制,它要求用户提供用户名和密码作为标准的HTTP头部信息("Authorization")的一部分,从而验证用户身份。Django内置了HTTP Basic身份验证的功能,可以通过以下步骤实现:

  1. 在settings.py中添加以下代码:
MIDDLEWARE = [
    # ...
    'django.contrib.auth.middleware.AuthenticationMiddleware', # 添加认证中间件
    # ...
]

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.AllowAllUsersModelBackend', # 允许所有用户进行认证
]
  1. 在views.py中编写视图函数,实现HTTP Basic身份验证:
from django.contrib.auth import authenticate
from django.http import HttpResponse
from django.views.decorators.http import require_http_methods

@require_http_methods(["GET"]) # 支持GET请求
def my_view(request):
    # 获取认证头部信息
    auth_header = request.META.get('HTTP_AUTHORIZATION').split()
    # 验证头部信息是否正确
    if len(auth_header) == 2 and auth_header[0].lower() == 'basic':
        # 解码用户名和密码
        auth_bytes = base64.b64decode(auth_header[1]).decode('utf-8').partition(':')
        # 使用authenticate方法验证用户身份
        user = authenticate(username=auth_bytes[0], password=auth_bytes[2])
        if user is not None and user.is_active:
            # 认证成功后返回相应结果
            return HttpResponse("认证成功!")
    # 认证失败返回401响应(需要身份认证)
    response = HttpResponse(status=401)
    response['WWW-Authenticate'] = 'Basic realm="example"'
    return response
  1. 使用浏览器或者curl等工具发送GET请求,带上合适的用户名和密码,即可进行HTTP Basic身份验证。如下所示:
curl -u pidancode.com:皮蛋编程 http://localhost:8000/my_view/

以上代码中,curl命令通过"-u"参数指定了用户名和密码,发送GET请求到http://localhost:8000/my_view/视图函数中,如果用户名和密码正确,则返回“认证成功!”的响应;如果认证失败,则返回401状态码和需要身份认证的响应头部信息。

相关文章