tur*_*lin 5 python django basic-authentication
我正在创建一个视图,预计该视图将由机器人访问,并在标头中传递用户名和密码。(具体来说,这是一个谷歌提要机器人)。但是,我似乎永远无法访问用户名和密码来验证机器人的凭据。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)
Run Code Online (Sandbox Code Playgroud)
如何从我的基本身份验证标头中检索用户名和密码?
tur*_*lin 10
感谢nthall为我指明了正确的方向——找到request.META字典是关键。
由于我找不到太多解释该过程的资源,因此我将在此处发布用于从 Authorization 标头检索和验证数据的整个 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.
Run Code Online (Sandbox Code Playgroud)
Django 将“HTTP_”前缀大写并附加到请求中传递的任何标头,正如 nthall 正确指出的那样,它可以通过request.META.
我隔离了 base64 编码的信息,它的格式'Basic username:password'是通过在空间上拆分标题,所以它只是'username:password'. 然后我使用 base64 解码,然后解码结果以将类似字节的字符串转换为 utf-8 字符串。那么这只是隔离用户名和密码的问题。然后进行身份验证过程。
| 归档时间: |
|
| 查看次数: |
4031 次 |
| 最近记录: |