Redis Token 过期刷新方案

作为一名经验丰富的开发者,我很高兴能帮助刚入行的小白们理解并实现 Redis Token 过期刷新方案。在本文中,我将详细介绍整个流程,并提供必要的代码示例。

流程概述

首先,让我们通过一个表格来概述整个流程:

步骤 描述
1 客户端发送登录请求
2 服务端验证用户身份
3 服务端生成 Token
4 服务端设置 Token 过期时间并存储到 Redis
5 客户端接收 Token 并进行存储
6 客户端使用 Token 进行请求
7 服务端验证 Token 有效性
8 服务端刷新 Token 过期时间
9 客户端更新本地存储的 Token

详细步骤与代码示例

步骤 1: 客户端发送登录请求

客户端通过用户名和密码向服务端发送登录请求。

步骤 2: 服务端验证用户身份

服务端接收到登录请求后,验证用户名和密码的正确性。

def validate_user(username, password):
    # 假设这里有用户验证逻辑
    if username == "admin" and password == "password":
        return True
    return False

步骤 3: 服务端生成 Token

验证成功后,服务端生成一个 Token。

import jwt

def generate_token(user_id):
    payload = {
        'user_id': user_id,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)  # 设置过期时间为 1 小时
    }
    token = jwt.encode(payload, 'secret_key', algorithm='HS256')
    return token

步骤 4: 服务端设置 Token 过期时间并存储到 Redis

将 Token 和其过期时间存储到 Redis 中。

import redis

r = redis.Redis()

def save_token_to_redis(token, user_id):
    r.setex(f"token:{user_id}", 3600, token)  # 设置过期时间为 1 小时

步骤 5: 客户端接收 Token 并进行存储

客户端接收到 Token 后,将其存储在本地(如 localStorage 或 cookie)。

步骤 6: 客户端使用 Token 进行请求

客户端在每次请求时,将 Token 作为请求头发送给服务端。

步骤 7: 服务端验证 Token 有效性

服务端接收到请求后,首先验证 Token 的有效性。

def verify_token(token):
    try:
        payload = jwt.decode(token, 'secret_key', algorithms=['HS256'])
        return payload
    except jwt.ExpiredSignatureError:
        return None

步骤 8: 服务端刷新 Token 过期时间

如果 Token 有效,服务端刷新其在 Redis 中的过期时间。

def refresh_token_expiration(token, user_id):
    current_token = r.get(f"token:{user_id}")
    if current_token == token:
        r.expire(f"token:{user_id}", 3600)  # 刷新过期时间为 1 小时

步骤 9: 客户端更新本地存储的 Token

如果服务端返回新的 Token,客户端需要更新本地存储的 Token。

// 假设新的 Token 存储在 response.token 中
localStorage.setItem('token', response.token);

类图

以下是使用 Mermaid 语法生成的类图:

classDiagram
    class Client {
        +sendLoginRequest()
        +storeToken()
        +sendRequestWithToken()
        +updateToken()
    }

    class Server {
        +validateUser()
        +generateToken()
        +saveTokenToRedis()
        +verifyToken()
        +refreshTokenExpiration()
    }

    Client --> Server: sendLoginRequest()
    Client <-- Server: receiveToken()
    Client --> Server: sendRequestWithToken()
    Server --> Client: verifyToken()
    Server --> Client: refreshToken()
    Client --> Client: updateToken()

结语

通过本文的介绍,相信刚入行的小白们已经对 Redis Token 过期刷新方案有了初步的了解。在实际开发过程中,可能还会遇到各种问题,但只要掌握了基本原理和方法,就能够灵活应对。希望本文对大家有所帮助,也欢迎大家在实际开发中不断探索和实践。