基于双token的无感刷新,如何封装刷新token
时间: 2025-01-08 21:02:05 浏览: 64
在现代Web应用中,基于双token的无感刷新机制是一种常见的安全实践,用于在用户会话过期时自动刷新token,而无需用户重新登录。这种机制通常涉及两种类型的token:访问token(access token)和刷新token(refresh token)。访问token用于访问受保护的资源,而刷新token用于在访问token过期时获取新的访问token。
以下是封装刷新token的步骤和示例代码:
### 步骤
1. **生成token**:在用户登录时生成访问token和刷新token。
2. **存储token**:将刷新token存储在服务器端(如数据库)和客户端(如HTTP-only cookie)。
3. **刷新token**:当访问token过期时,客户端使用刷新token请求新的访问token。
4. **验证token**:服务器验证刷新token的有效性,并生成新的访问token和刷新token。
5. **更新token**:将新的刷新token存储在服务器端和客户端,并返回新的访问token给客户端。
### 示例代码
#### 1. 生成token
```python
import jwt
import datetime
def generate_tokens(user_id):
access_token = jwt.encode(
{
'user_id': user_id,
'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=15)
},
'access_secret',
algorithm='HS256'
)
refresh_token = jwt.encode(
{
'user_id': user_id,
'exp': datetime.datetime.utcnow() + datetime.timedelta(days=7)
},
'refresh_secret',
algorithm='HS256'
)
return access_token, refresh_token
```
#### 2. 存储token
```python
def store_refresh_token(user_id, refresh_token):
# 假设使用Redis存储刷新token
redis_client.set(f"refresh_token_{user_id}", refresh_token, ex=604800) # 7天过期
```
#### 3. 刷新token
```python
def refresh_tokens(refresh_token):
try:
payload = jwt.decode(refresh_token, 'refresh_secret', algorithms=['HS256'])
user_id = payload['user_id']
# 验证刷新token是否有效
stored_refresh_token = redis_client.get(f"refresh_token_{user_id}")
if stored_refresh_token and stored_refresh_token.decode() == refresh_token:
# 生成新的访问token和刷新token
new_access_token, new_refresh_token = generate_tokens(user_id)
store_refresh_token(user_id, new_refresh_token)
return new_access_token, new_refresh_token
else:
return None, None
except jwt.ExpiredSignatureError:
return None, None
except jwt.InvalidTokenError:
return None, None
```
#### 4. 验证token
```python
def verify_access_token(access_token):
try:
payload = jwt.decode(access_token, 'access_secret', algorithms=['HS256'])
return payload['user_id']
except jwt.ExpiredSignatureError:
return None
except jwt.InvalidTokenError:
return None
```
### 总结
通过上述步骤和代码示例,我们可以实现基于双token的无感刷新机制。这种机制不仅提高了安全性,还提升了用户体验。
阅读全文
相关推荐
















