我正在创建一个 View ,该 View 应该被机器人在 header 中传递用户名和密码来访问。 (具体来说,这是一个Google Feed机器人)。但是,我似乎永远无法访问用户名和密码来验证机器人的凭据。 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)

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

最佳答案

谢谢nthall指出正确的方向-找到request.META字典是关键。

由于找不到用于解释该过程的资源,因此我将在此处发布整个Django进程,以从Authorization header 中检索和认证数据。

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_”前缀大写并将其附加到请求中传递的任何 header 中,并且如nthall正确指出的那样,可以通过request.META对其进行访问。

我通过在空间上拆分 header 来隔离base64编码的信息,该信息的格式为'Basic username:password',所以它只是'username:password'。然后,我使用base64进行解码,然后对结果进行解码,以将类似字节的字符串转换为utf-8字符串。然后,只需隔离用户名和密码即可。然后进行身份验证过程。

关于python - 在Django请求 header 中访问用户名和密码返回None,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38016684/

10-16 15:53