在django请求标头中访问用户名和密码将返回None

时间:2016-06-24 15:13:52

标签: python django basic-authentication

我正在创建一个视图,该视图预计将由标头中传递用户名和密码的机器人访问。 (这是一个具体的谷歌饲料机器人)。但是,我似乎永远无法访问用户名和密码来验证机器人的凭据。 request.GET.get('username')request.GET.get('password')都返回None,因为request.GETrequest.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)

如何从基本身份验证标题中检索用户名和密码?

2 个答案:

答案 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.GETrequest.POST都不会引用请求标头。您正在寻找的数据最有可能在request.META的字典中找到 - 有关HttpRequest docs中详细信息的更多详细信息。不确定您的设置细节,但听起来您正在寻找request.META['username']request.META['password']