我正在创建一个视图,该视图预计将由标头中传递用户名和密码的机器人访问。 (这是一个具体的谷歌饲料机器人)。但是,我似乎永远无法访问用户名和密码来验证机器人的凭据。 request.GET.get('username')
和request.GET.get('password')
都返回None
,因为request.GET
和request.POST
都返回空的QueryDicts。我使用Postman进行基本身份验证来测试我的请求。
以下是views.py
的代码:
def authenticate_bot(request):
username = request.GET.get('username')
password = request.GET.get('password')
feed_bot = authenticate(username=username, password=password)
if feed_bot is not None:
# Confirmed as user credentials.
login(request, feed_bot)
如何从基本身份验证标题中检索用户名和密码?
答案 0 :(得分:3)
感谢nthall指出我正确的方向 - 找到request.META
词典是关键。
由于我无法找到解释流程的资源,我将发布整个Django流程,以便从授权标题中检索和验证数据。
import base64
from django.contrib.auth import authenticate
def header_auth_view(request):
auth_header = request.META['HTTP_AUTHORIZATION']
encoded_credentials = auth_header.split(' ')[1] # Removes "Basic " to isolate credentials
decoded_credentials = base64.b64decode(encoded_credentials).decode("utf-8").split(':')
username = decoded_credentials[0]
password = decoded_credentials[1]
feed_bot = authenticate(username=username, password=password)
# if the credentials are correct, then the feed_bot is not None, but is a User object.
Django将HTTP'请求中传递的任何标头的前缀,正如nthall正确指出的那样,可以通过request.META
访问它。
我通过在空格上分割标题来隔离base64编码信息,格式为'Basic username:password'
,因此它只是'username:password'
。然后我使用base64解码然后解码结果以将类字节的字符串转换为utf-8字符串。然后,只需隔离用户名和密码即可。然后完成身份验证过程。
答案 1 :(得分:2)
request.GET
和request.POST
都不会引用请求标头。您正在寻找的数据最有可能在request.META
的字典中找到 - 有关HttpRequest docs中详细信息的更多详细信息。不确定您的设置细节,但听起来您正在寻找request.META['username']
和request.META['password']