1.注册功能
关键功能
-
三个框,用户邮箱,密码,验证码
-
开启官方邮箱,用来发验证码(QQ 网易都支持开启smtp协议,找教程,用邮箱不用手机号是为了省买发短信云服务的钱)
-
验证码缓存于redis,5min内有效
-
验证密码长度,验证码是否正确
-
新用户信息保存于mysql,密码使用md5第三方库进行加密
1.1安全性验证
-
对用户密码使用md进行加密,
hashlib
库是内置的,可以直接用于实现MD5加密,无需额外安装第三方库。
from hashlib import md5 # 对密码进行MD5加密 password_hash = md5(register_form.password.encode('utf-8')).hexdigest()
-
用户成功注册后,使用md加密存入数据库。
-
同时,在注册接口中,对各种情况做了处理,例如用户重复注册。
2.登录功能
关键任务:
-
用户邮箱与密码登录
-
校验身份
-
根据用户身份信息(也即邮箱,但不要包含密码)生成token
-
将token附带在响应中,发回客户端
2.1安全性验证
生成一个token,特别是JWT(JSON Web Token),通常包含三个部分:头部(Header)、载荷(Payload)和签名(Signature)。基于用户的身份信息(在这里是邮箱),我们可以设计一个简单的JWT生成过程,不包含密码。以下是使用Python的pyjwt
库来生成JWT的一个示例步骤:
import jwt
from datetime import datetime, timedelta
import uuid
# 定义秘钥,用于签名,应妥善保管,不能泄露
SECRET_KEY = "your_secret_key_here"
ALGORITHM = "HS256" # 使用HS256算法进行签名
def generate_token(email):
# 载荷包含声明,这里是用户邮箱
payload = {
"sub": "user_email", # 'sub' 代表subject,这里用邮箱标识用户身份
"email": email,
"exp": datetime.utcnow() + timedelta(hours=1), # 设置过期时间为1小时后
"iat": datetime.utcnow(), # 发行时间
"jti": str(uuid.uuid4()), # JWT ID,用于唯一标识JWT,防止重复使用
}
# 生成JWT
token = jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)
return token
# 示例:使用邮箱生成Token
email = "example@example.com"
token = generate_token(email)
print(token)
-
在本次开发中,token主要用于身份验证与授权:Token作为一种临时的访问凭证,用于验证用户身份并控制他们访问特定资源或执行特定操作的权限。用户首次登录时,服务器验证其凭据(用户名和密码),并通过响应发送一个Token。之后,客户端在每次请求服务时携带这个Token,而不是反复发送用户名和密码,以此提升安全性并简化后续的认证流程。