我有一个python库,我为其他东西写了.所以我导入它在Django中使用,我面临的问题是如何获取密码.
mycustom_lib_function(username, password)
Run Code Online (Sandbox Code Playgroud)
username 我可以通过 request.user
但是,我不知道如何获取密码.有人能帮我吗?谢谢.
从技术上讲,您可以将密码存储为纯文本,但从安全角度来看这是不正确的,请参阅此答案,强烈不推荐!django.contrib.auth.hashers 有一些很好的密码工具,请参阅官方 Django 文档。
如果您知道纯文本密码可能是什么,即我的一个应用程序中有一个全局存储的默认密码,该密码以纯文本形式存储,如下例所示。要检查用户的密码是否设置为默认密码,您可以使用 check_password 函数,如果纯文本与编码密码匹配,该函数将返回 True:
from django.contrib.auth.hashers import check_password
from django.contrib.auth.models import User
u = User.objects.all().first()
if check_password('the default password', u.password):
print 'user password matches default password'
else:
print 'user a set custom password'
Run Code Online (Sandbox Code Playgroud)
另请参阅 is_password_usable 和 make_password 函数。
您的功能mycustom_lib_function不应使用纯文本密码。用户对您的应用程序进行身份验证后,您将拥有一个User对象(来自django.contrib.auth.models),其中包含哈希密码:
>>> user.username
u'myusername'
>>> user.password
u'sha1$98ffc$b5fd085b8bc1c05fd241dfc97230631926141fe7'
Run Code Online (Sandbox Code Playgroud)
键入到表单中的实际密码不会以纯文本形式存储,因为标准的Web安全性建议您不要在身份验证后存储密码的纯文本值。
请注意,您可以通过执行以下操作来检查上述哈希:
>>> from hashlib import sha1
>>> password = 'weak_password'
>>> _, salt, hashpw = user.password.split('$')
>>> sha1(salt+password).hexdigest() == hashpw
True
Run Code Online (Sandbox Code Playgroud)
现在,如果您的应用程序包装到另一个您不需要控制的应用程序中,该应用程序需要密码才能执行某些操作,则可以考虑以纯文本形式存储其密码(或者稍微更好地对其进行加密),但是django.contrib.auth不会为您这样做。如果您设置一个OAuth类型的凭证系统会更好,该系统可以完全执行此功能,而无需用户向中间站点透露密码。
如果它是您控制的应用程序,那么我将放弃将密码传递给它的要求。