访问Django请求头中的用户名和密码返回Non

2024-10-01 11:31:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个视图,希望bot在头中传递用户名和密码来访问它。(具体来说,这是一个googlefeed机器人)。但是,我似乎永远无法访问用户名和密码来验证bot的凭据。request.GET.get('username')request.GET.get('password')都返回None,因为request.GET和{}都返回空的QueryDicts。我使用具有基本身份验证的邮递员来测试我的请求。 以下是我来自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)

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


Tags: none身份验证视图密码getrequestfeedbot
2条回答

感谢您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字符串。那么,只需要隔离用户名和密码。然后进行身份验证。在

request.GET和{}都没有引用请求头。您要查找的数据很可能可以在字典中找到,地址是request.META,更多详细信息请参见HttpRequest docs。不确定您的设置细节,但听起来您似乎在寻找request.META['username']和{}

相关问题 更多 >