欢迎访问宙启技术站
智能推送

如何在Python中实现用户身份验证和登录功能

发布时间:2024-01-13 21:46:14

在Python中实现用户身份验证和登录功能一般包括以下步骤:

1. 创建一个用户数据库:可以使用数据库管理系统如MySQL或者SQLite,创建一个用户表,包含用户名和密码等字段。

2. 创建用户注册功能:用户可以通过提供用户名和密码等信息注册一个新用户。在注册时,需要检查用户名是否已经存在于数据库中,若存在则提示用户换一个用户名;若不存在,则将新用户信息插入数据库中。

3. 创建用户登录功能:用户输入用户名和密码,系统会通过查询数据库验证用户信息。如果用户名和密码正确,登录成功,系统会为该用户生成一个身份标识(token)并返回给用户,以后用户每次请求时需要提供这个token来验证身份。

4. 创建请求验证功能:当用户发送请求时,系统需要验证用户的身份。用户在请求中需要包含token,系统会根据token查询数据库验证用户身份的有效性。

5. 创建保持用户登录状态功能:用户在登录后一般需要保持一段时间的在线状态,所以需要在数据库中添加一个字段来记录上次登录时间或者token的有效期,根据需要定时清理过期的token。

下面是一个简单的示例代码,使用Python Flask框架和SQLite数据库实现用户身份验证和登录功能:

from flask import Flask, request
import sqlite3
import datetime
import hashlib
import uuid

app = Flask(__name__)
app.secret_key = 'secret_key'

# 创建用户表
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS users
                  (id INTEGER PRIMARY KEY AUTOINCREMENT,
                   username TEXT,
                   password TEXT,
                   token TEXT,
                   last_login DATETIME)''')
conn.commit()

# 用户注册
@app.route('/register', methods=['POST'])
def register():
    username = request.form['username']
    password = request.form['password']

    # 检查用户名是否已存在
    cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
    if cursor.fetchone():
        return 'Username already exists'

    # 密码加密
    salt = uuid.uuid4().hex
    hashed_password = hashlib.sha256((password + salt).encode()).hexdigest()

    # 将用户信息存入数据库
    cursor.execute("INSERT INTO users (username, password, last_login) VALUES (?, ?, ?)",
                   (username, hashed_password, datetime.datetime.now()))
    conn.commit()

    return 'Registration successful'

# 用户登录
@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']

    # 查询数据库验证用户信息
    cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
    user = cursor.fetchone()

    if not user:
        return 'User not found'

    # 验证密码
    hashed_password = hashlib.sha256((password + user[2]).encode()).hexdigest()
    if hashed_password != user[2]:
        return 'Incorrect password'

    # 更新用户登录时间和token
    token = uuid.uuid4().hex
    cursor.execute("UPDATE users SET token = ?, last_login = ? WHERE id = ?", (token, datetime.datetime.now(), user[0]))
    conn.commit()

    return 'Login successful. Your token is {}'.format(token)

# 请求验证
@app.route('/secure')
def secure():
    token = request.args.get('token')

    # 查询数据库验证token
    cursor.execute("SELECT * FROM users WHERE token = ?", (token,))
    user = cursor.fetchone()

    if not user:
        return 'Invalid token'

    return 'Welcome, {}'.format(user[1])

if __name__ == '__main__':
    app.run()

在运行该代码之前,需要先安装Flasksqlite3库,并创建一个名为users.db的SQLite数据库文件来存储用户信息。

通过以上代码,我们实现了用户注册、登录和请求验证功能。用户在注册时提供用户名和密码,系统会将密码经过加密处理后存入数据库中。用户登录时,系统会查询数据库验证用户信息,并为用户生成一个token,并更新用户的登录时间和token。在请求验证时,用户需要在请求中提供token,系统会通过查询数据库验证token的有效性,并返回相应的结果。

这只是一个简单的示例,实际的用户认证和登录功能还可以根据需求进行扩展和优化。