Django中为GET请求添加HTTP基础认证的代码修改咨询
给GET请求视图添加HTTP基础认证
没问题,我帮你把views.py里的代码改成支持curl --user username:password http://some_url/这种HTTP基础认证的版本,直接就能用:
# views.py # 如果你用Django,导入对应的响应类 from django.http import HttpResponse, HttpResponseUnauthorized # 硬编码的已授权用户(实际项目别这么干,建议存数据库/配置文件) AUTHORIZED_CREDENTIALS = { "your_username": "your_password", # 可以添加多个授权用户 } def handle_request(request): if request.method == 'GET': # 从请求头里获取基础认证信息 auth_header = request.META.get('HTTP_AUTHORIZATION') # 第一步:检查是否有合法的认证头 if not auth_header or not auth_header.startswith('Basic '): # 没有认证信息则返回401,告诉客户端需要认证 response = HttpResponseUnauthorized("请提供有效的用户名和密码") response['WWW-Authenticate'] = 'Basic realm="Your Application"' return response # 第二步:解码认证信息 import base64 # 拆分出base64编码的部分 encoded_credentials = auth_header.split(' ')[1] # 解码并转成字符串 decoded_credentials = base64.b64decode(encoded_credentials).decode('utf-8') # 拆分用户名和密码(用split(':')只拆一次,兼容密码含冒号的情况) username, password = decoded_credentials.split(':', 1) # 第三步:验证用户名密码是否匹配 if AUTHORIZED_CREDENTIALS.get(username) == password: # 认证通过,执行你原来的业务逻辑 <do something> return response else: # 认证失败,返回401 return HttpResponseUnauthorized("用户名或密码错误")
关键细节说明:
- 认证头规范:HTTP基础认证的信息会放在
Authorization请求头里,格式为Basic <base64编码的username:password>,所以要先检查头的合法性 - 解码兼容:用
split(':', 1)拆分用户名和密码,避免密码里带冒号导致拆分出错 - 401响应规范:必须添加
WWW-Authenticate头,这样curl、浏览器这类客户端才会主动提示用户输入认证信息 - 安全提示:生产环境绝对不要硬编码用户名密码!建议用框架自带的用户模型(比如Django的User)或者配置管理工具存储敏感信息
如果你的项目用的是Flask而非Django,只需修改获取请求头和返回响应的方式:
# Flask版本关键代码 from flask import request, make_response # 获取认证头 auth_header = request.headers.get('Authorization') # 返回401的方式 response = make_response("请提供有效的用户名和密码", 401) response.headers['WWW-Authenticate'] = 'Basic realm="Your Application"' return response
内容的提问来源于stack exchange,提问作者D_M
相关产品推荐
相关产品推荐

