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

Python中使用JWT进行单点登录

发布时间:2023-12-27 05:32:30

JWT(JSON Web Token)是一种用于在网络应用间传递声明的简洁、安全的方式。在Python中,我们可以使用PyJWT库来实现JWT的生成和验证。在单点登录(SSO)中,JWT可以作为认证凭证,在不同的应用之间传递用户的认证状态。下面是一个使用JWT进行单点登录的简单示例。

首先,我们需要安装PyJWT库。可以通过以下命令在命令行中安装:

pip install pyjwt

接下来,我们可以创建一个JWT生成和验证的工具类,用于生成和解析JWT。假设我们的单点登录系统中有两个应用,一个是登录系统(login_app),另一个是用户信息系统(user_app)。

import jwt
import datetime

class JWTUtil:
    # 密钥
    secret_key = 'your_secret_key'

    # 生成JWT
    @staticmethod
    def generate_token(user_id, expires_in_minutes):
        # 设置过期时间
        expiry = datetime.datetime.utcnow() + datetime.timedelta(minutes=expires_in_minutes)

        # 设置payload
        payload = {
            'user_id': user_id,
            'exp': expiry
        }

        # 生成JWT
        token = jwt.encode(payload, JWTUtil.secret_key, algorithm='HS256')

        return token

    # 解析JWT
    @staticmethod
    def decode_token(token):
        try:
            # 验证JWT
            payload = jwt.decode(token, JWTUtil.secret_key, algorithms=['HS256'])

            return payload
        except jwt.ExpiredSignatureError:
            # JWT过期
            return None
        except jwt.InvalidTokenError:
            # 无效的JWT
            return None

接下来,我们可以在登录系统中生成JWT,并将其返回给用户:

from flask import Flask, jsonify, request
from jwt_util import JWTUtil

app = Flask(__name__)

@app.route('/login', methods=['POST'])
def login():
    # 获取用户ID
    user_id = request.json.get('user_id')

    # 生成JWT
    token = JWTUtil.generate_token(user_id, expires_in_minutes=60)

    return jsonify({'token': token.decode('utf-8')})

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

然后,在用户信息系统中,我们可以验证接收到的JWT,并获取用户ID:

from flask import Flask, jsonify, request
from jwt_util import JWTUtil

app = Flask(__name__)

@app.route('/user_info', methods=['POST'])
def user_info():
    # 获取JWT
    token = request.json.get('token')

    # 验证JWT
    payload = JWTUtil.decode_token(token)

    if payload is None:
        # JWT验证失败
        return jsonify({'error': 'Invalid token'})

    user_id = payload.get('user_id')
    # 根据用户ID获取用户信息

    return jsonify({'user_id': user_id, 'name': 'John Doe'})

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

在前端,用户可以通过登录系统进行登录,并将返回的JWT作为参数发送到用户信息系统来获取用户信息:

fetch('/login', {
    method: 'POST',
    body: JSON.stringify({user_id: '123'}),
    headers: {'Content-Type': 'application/json'}
})
.then(response => response.json())
.then(data => {
    fetch('/user_info', {
        method: 'POST',
        body: JSON.stringify({token: data.token}),
        headers: {'Content-Type': 'application/json'}
    })
    .then(response => response.json())
    .then(data => console.log(data));
});

在以上示例中,我们通过JWT实现了单点登录。用户在登录系统中登录成功后会获得一个JWT,然后可以将这个JWT发送到用户信息系统来获取用户信息。用户信息系统通过验证JWT的合法性,并解析其中的Payload来获取用户ID。

需要注意的是,JWT的安全性依赖于密钥的保密性。在实际使用中,应该使用长且随机的密钥,并妥善保管。如果密钥泄露,可能会导致未经授权的用户获得访问权限。