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的安全性依赖于密钥的保密性。在实际使用中,应该使用长且随机的密钥,并妥善保管。如果密钥泄露,可能会导致未经授权的用户获得访问权限。
