我正在构建自定义帐户系统,当用户创建帐户时,我将其保存到数据存储区,但经过验证'字段默认设置为false(在验证字段设置为true之前,无法使用帐户登录。)
class Account(ndb.Model):
username = ndb.StringProperty(required = True)
password = ndb.StringProperty(required = True)
email = ndb.StringProperty(required = True)
verified = ndb.BooleanProperty(default = False)
created = ndb.DateTimeProperty(auto_now_add = True)
'用户名'在我的应用程序中应该是独特和重要的。我正在设置' id'实体到用户名,然后使用get_by_id方法在所有其他操作中获取帐户。
acc = Account( id=username,
username = username,
password = password,
email = email)
当我保存帐户时,我使用uslsafe将其密钥转换为字符串。
urlString = rev_key.urlsafe()
我正在使用此字符串构建一个URL并将其邮寄给用户,稍后根据该URL的请求使用uslString构建我的密钥并转向'验证'字段为真。
但这暴露了我的实际密钥,它可能会暴露用户名。我对此有几个问题。
答案 0 :(得分:4)
密钥只适用于您的应用,app-id
实际上是完整密钥的一部分;但正如你想象的那样,任何人都可以为不同的用户名构建一个密钥,从而验证它们,即使他们没有收到电子邮件。正如@Paul的评论所指出的,你不应该相信密钥没有被篡改过。
我建议您单独处理验证,例如:
import hashlib
import os
class Verification(ndb.Model):
account = ndb.KeyProperty()
@classmethod
def create(cls, account):
verification = cls(
id=hashlib.sha1(os.urandom(16)).hexdigest(),
account=account.key,
).put()
return verification.id()
@classmethod
def validate(cls, verification_id):
verification = cls.get_by_id(verification_id)
account = verification.account.get()
account.verified = True
account.put()
我们在这里做的是创建一个不同的模型Verification来处理这个功能;创建时,此实体会获得一个模糊的ID,然后您可以使用该ID来验证正确的帐户。您可以在此基础上处理特定于应用程序的功能。