实现不同域上托管的网站的单点登录可以使用以下方法:
示例代码(使用JWT):
import jwt
# 用户登录成功后生成Token
def generate_token(user_id):
payload = {'user_id': user_id}
secret_key = 'your_secret_key'
algorithm = 'HS256'
token = jwt.encode(payload, secret_key, algorithm=algorithm)
return token
# 用户登录
def login():
# 根据用户名和密码验证用户身份
user_id = '12345'
token = generate_token(user_id)
# 将Token返回给用户
# 在其他域上验证Token
def validate_token(token):
secret_key = 'your_secret_key'
try:
payload = jwt.decode(token, secret_key)
user_id = payload['user_id']
# 验证用户ID有效性
return user_id
except jwt.ExpiredSignatureError:
# Token过期处理
return None
except jwt.InvalidTokenError:
# Token无效处理
return None
# 在其他域上的登录验证
def validate_login():
# 获取传递的Token参数
token = 'your_token'
user_id = validate_token(token)
if user_id:
# 用户登录验证通过
# 执行其他逻辑
else:
# 用户登录验证失败
# 执行其他逻辑
示例代码(使用Python Flask框架):
from flask import Flask, request, jsonify, redirect
app = Flask(__name__)
# 用户登录
@app.route('/login', methods=['POST'])
def login():
# 根据用户名和密码验证用户身份
user_id = '12345'
# 将用户信息添加到请求头中
headers = {'user_id': user_id}
# 获取要跳转的目标网站URL
target_url = request.form.get('target_url')
# 构造重定向URL,将用户信息传递给目标网站
redirect_url = target_url + '?' + '&'.join([f'{k}={v}' for k, v in headers.items()])
return redirect(redirect_url)
# 在其他域上的登录验证
@app.route('/validate_login', methods=['GET'])
def validate_login():
# 获取传递的用户信息
user_id = request.headers.get('user_id')
if user_id:
# 用户登录验证通过
# 执行其他逻辑
return jsonify({'status': 'success'})
else:
# 用户登录验证失败
# 执行其他逻辑
return jsonify({'status': 'failure'})
if __name__ == '__main__':
app.run()
以上示例代码仅为示意,具体的实现方式还需要根据实际需求和技术栈进行调整。