PyJWT 登录 sqlite
时间: 2024-07-16 15:01:17 浏览: 86
PyJWT是一个Python库,用于处理JSON Web Tokens(JWT)。它主要用于安全地在客户端和服务端之间传输信息,例如用户登录验证。如果你想在SQLite数据库中存储用户的JWT令牌并进行登录验证,可以按照以下步骤操作:
1. **安装依赖**:
首先,确保已经安装了`PyJWT`, `SQLAlchemy`(ORM工具用于操作SQLite)以及可能需要的加密库,如`cryptography`(如果你计划对JWT进行加密)。
```bash
pip install pyjwt sqlalchemy cryptography
```
2. **模型设计**:
创建一个User模型,包含一个JWT Secret(用于签发和验证JWT)和一个SQLite字段来存储JWT。
```python
from sqlalchemy import Column, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(String, primary_key=True)
jwt_secret = Column(String)
token = Column(String) # 存储已签发的JWT
```
3. **登录认证**:
用户登录时,生成JWT,并将其加密存储到数据库。同时存储JWT Secret以备后续验证。
```python
def generate_jwt(user_id, secret):
payload = {'sub': user_id}
encoded_jwt = jwt.encode(payload, secret, algorithm='HS256')
return encoded_jwt, secret
def register_user_and_login(user_data):
new_user = User(id=user_data['id'], jwt_secret=generate_jwt_secret())
db.session.add(new_user)
db.session.commit()
# 返回生成的JWT和秘钥
return new_user.token, new_user.jwt_secret
```
4. **验证登录**:
当接收JWT请求时,从数据库查找对应的用户,然后解密并验证JWT。
```python
def validate_jwt(token, user_secret):
try:
decoded_token = jwt.decode(token, user_secret, algorithms=['HS256'])
if 'sub' in decoded_token and decoded_token['sub'] == get_user_id_from_db(token): # 根据JWT中的信息获取用户ID
return True
except jwt.exceptions.InvalidTokenError:
pass
return False
```
5. **授权访问**:
在需要的地方,检查请求头或cookie的JWT是否有效。
```python
def protected_endpoint():
auth_header = request.headers.get('Authorization', '')
if not validate_jwt(auth_header.split(' '), get_secret_from_db()):
raise HTTPException(status_code=401, detail="Unauthorized")
# 接下来的代码仅对授权用户开放
```