forked from datawhale/whale-town-end
feat: 添加JWT认证系统和Zulip用户管理服务
- 新增JWT认证守卫(JwtAuthGuard)和当前用户装饰器(CurrentUser) - 添加JWT使用示例和完整的认证流程文档 - 实现Zulip用户管理服务,支持用户查询、验证和管理 - 实现Zulip用户注册服务,支持新用户创建和注册流程 - 添加完整的单元测试覆盖 - 新增真实环境测试脚本,验证Zulip API集成 - 更新.gitignore,排除.kiro目录 主要功能: - JWT令牌验证和用户信息提取 - 用户存在性检查和信息获取 - Zulip API集成和错误处理 - 完整的测试覆盖和文档
This commit is contained in:
196
test_zulip_registration.js
Normal file
196
test_zulip_registration.js
Normal file
@@ -0,0 +1,196 @@
|
||||
/**
|
||||
* Zulip用户注册真实环境测试脚本
|
||||
*
|
||||
* 功能描述:
|
||||
* - 测试Zulip用户注册功能在真实环境下的表现
|
||||
* - 验证API调用是否正常工作
|
||||
* - 检查配置是否正确
|
||||
*
|
||||
* 使用方法:
|
||||
* node test_zulip_registration.js
|
||||
*
|
||||
* @author angjustinl
|
||||
* @version 1.0.0
|
||||
* @since 2025-01-06
|
||||
*/
|
||||
|
||||
const https = require('https');
|
||||
const { URLSearchParams } = require('url');
|
||||
|
||||
// 配置信息
|
||||
const config = {
|
||||
zulipServerUrl: 'https://zulip.xinghangee.icu',
|
||||
zulipBotEmail: 'angjustinl@mail.angforever.top',
|
||||
zulipBotApiKey: 'lCPWCPfGh7WUHxwN56GF8oYXOpqNfGF8',
|
||||
};
|
||||
|
||||
/**
|
||||
* 检查用户是否存在
|
||||
*/
|
||||
async function checkUserExists(email) {
|
||||
console.log(`🔍 检查用户是否存在: ${email}`);
|
||||
|
||||
try {
|
||||
const url = `${config.zulipServerUrl}/api/v1/users`;
|
||||
const auth = Buffer.from(`${config.zulipBotEmail}:${config.zulipBotApiKey}`).toString('base64');
|
||||
|
||||
const response = await fetch(url, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Authorization': `Basic ${auth}`,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
console.log(`❌ 获取用户列表失败: ${response.status} ${response.statusText}`);
|
||||
return false;
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
console.log(`📊 获取到 ${data.members?.length || 0} 个用户`);
|
||||
|
||||
if (data.members && Array.isArray(data.members)) {
|
||||
const userExists = data.members.some(user =>
|
||||
user.email && user.email.toLowerCase() === email.toLowerCase()
|
||||
);
|
||||
|
||||
console.log(`✅ 用户存在性检查完成: ${userExists ? '存在' : '不存在'}`);
|
||||
return userExists;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
} catch (error) {
|
||||
console.error(`❌ 检查用户存在性失败:`, error.message);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建测试用户
|
||||
*/
|
||||
async function createTestUser(email, fullName, password) {
|
||||
console.log(`🚀 开始创建用户: ${email}`);
|
||||
|
||||
try {
|
||||
const url = `${config.zulipServerUrl}/api/v1/users`;
|
||||
const auth = Buffer.from(`${config.zulipBotEmail}:${config.zulipBotApiKey}`).toString('base64');
|
||||
|
||||
const requestBody = new URLSearchParams();
|
||||
requestBody.append('email', email);
|
||||
requestBody.append('full_name', fullName);
|
||||
|
||||
if (password) {
|
||||
requestBody.append('password', password);
|
||||
}
|
||||
|
||||
const response = await fetch(url, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Authorization': `Basic ${auth}`,
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
},
|
||||
body: requestBody.toString(),
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (!response.ok) {
|
||||
console.log(`❌ 用户创建失败: ${response.status} ${response.statusText}`);
|
||||
console.log(`📝 错误信息: ${data.msg || data.message || '未知错误'}`);
|
||||
return { success: false, error: data.msg || data.message };
|
||||
}
|
||||
|
||||
console.log(`✅ 用户创建成功! 用户ID: ${data.user_id}`);
|
||||
return { success: true, userId: data.user_id };
|
||||
|
||||
} catch (error) {
|
||||
console.error(`❌ 创建用户异常:`, error.message);
|
||||
return { success: false, error: error.message };
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试连接
|
||||
*/
|
||||
async function testConnection() {
|
||||
console.log('🔗 测试Zulip服务器连接...');
|
||||
|
||||
try {
|
||||
const url = `${config.zulipServerUrl}/api/v1/server_settings`;
|
||||
const response = await fetch(url);
|
||||
|
||||
if (response.ok) {
|
||||
const data = await response.json();
|
||||
console.log(`✅ 连接成功! 服务器版本: ${data.zulip_version || '未知'}`);
|
||||
return true;
|
||||
} else {
|
||||
console.log(`❌ 连接失败: ${response.status} ${response.statusText}`);
|
||||
return false;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`❌ 连接异常:`, error.message);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 主测试函数
|
||||
*/
|
||||
async function main() {
|
||||
console.log('🎯 开始Zulip用户注册测试');
|
||||
console.log('=' * 50);
|
||||
|
||||
// 1. 测试连接
|
||||
const connected = await testConnection();
|
||||
if (!connected) {
|
||||
console.log('❌ 无法连接到Zulip服务器,测试终止');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('');
|
||||
|
||||
// 2. 生成测试用户信息
|
||||
const timestamp = Date.now();
|
||||
const testEmail = `test_user_${timestamp}@example.com`;
|
||||
const testFullName = `Test User ${timestamp}`;
|
||||
const testPassword = 'test123456';
|
||||
|
||||
console.log(`📋 测试用户信息:`);
|
||||
console.log(` 邮箱: ${testEmail}`);
|
||||
console.log(` 姓名: ${testFullName}`);
|
||||
console.log(` 密码: ${testPassword}`);
|
||||
console.log('');
|
||||
|
||||
// 3. 检查用户是否已存在
|
||||
const userExists = await checkUserExists(testEmail);
|
||||
if (userExists) {
|
||||
console.log('⚠️ 用户已存在,跳过创建测试');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('');
|
||||
|
||||
// 4. 创建用户
|
||||
const createResult = await createTestUser(testEmail, testFullName, testPassword);
|
||||
|
||||
console.log('');
|
||||
console.log('📊 测试结果:');
|
||||
if (createResult.success) {
|
||||
console.log('✅ 用户注册功能正常工作');
|
||||
console.log(` 新用户ID: ${createResult.userId}`);
|
||||
} else {
|
||||
console.log('❌ 用户注册功能存在问题');
|
||||
console.log(` 错误信息: ${createResult.error}`);
|
||||
}
|
||||
|
||||
console.log('');
|
||||
console.log('🎉 测试完成');
|
||||
}
|
||||
|
||||
// 运行测试
|
||||
main().catch(error => {
|
||||
console.error('💥 测试过程中发生未处理的错误:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user