Go JWT 代码的封装和使用

10 min read

JWT(JSON Web Token)是一种用于进行身份认证的令牌,在 Web 应用中广泛使用。为了方便使用,我们可以对 JWT 进行封装,提供统一的接口。

下面展示一个简单的 JWT 封装和使用的示例。

封装 JWT

import jwt

class Jwt:
    key = 'your_secret_key'

    @classmethod
    def encode(cls, payload, exp=3600):
        payload['exp'] = int(time.time() + exp)
        token = jwt.encode(payload, cls.key, algorithm='HS256')
        return token.decode()

    @classmethod
    def decode(cls, token):
        try:
            payload = jwt.decode(token, cls.key, algorithms=['HS256'])
            return payload
        except jwt.ExpiredSignatureError:
            raise Exception('Token expired')
        except jwt.DecodeError:
            raise Exception('Token invalid')

使用 JWT

from app import app, Jwt

@app.route('/login', methods=['POST'])
def login():
    # 验证用户名和密码
    if not check_username_and_password(username, password):
        return {'error': 'Invalid username or password'}, 400

    # 生成 Token
    payload = {'username': username, 'role': role}
    token = Jwt.encode(payload)

    # 返回 Token
    return {'token': token}, 200

@app.route('/api', methods=['GET'])
def api():
    # 验证 Token
    header = request.headers.get('Authorization')
    if not header:
        return {'error': 'No Authorization header'}, 401
    token = header.split(' ')[1]
    try:
        payload = Jwt.decode(token)
    except Exception as e:
        return {'error': str(e)}, 401

    # 使用 Token 中的信息进行授权
    if not check_permission(payload['role']):
        return {'error': 'Permission denied'}, 403

    # 返回数据
    return {'data': 'Hello, ' + payload['username']}, 200

在这个示例中,我们首先定义了一个 Jwt 类,其中包含了对 JWT 的封装函数:encode 和 decode。encode 函数用于生成 Token,decode 函数用于解密 Token。在 encode 函数中,我们还可以指定有效期(单位为秒),默认为 3600 秒。这些函数会在应用中多次使用,因此封装起来方便统一管理。

在应用中,我们可以像上面的示例一样使用 Jwt 类来生成和解密 Token。在登录接口中,我们生成 Token 并返回给客户端,客户端可以将 Token 存储在本地,在后续请求中携带到服务端。在 API 接口中,我们首先从 HTTP 头部中获取 Token,然后进行解密和验证,最终使用 Token 中的信息进行授权和数据获取。