fix: mock_login支持X-Mock-Key请求头鉴权 + deploy自动配置随机密钥
This commit is contained in:
@@ -106,6 +106,17 @@ deploy_service_file() {
|
||||
fi
|
||||
|
||||
rsync -avzP "$(get_service_file_local)" "${REMOTE_USER}@${REMOTE_HOST}:/etc/systemd/system/${SERVICE_NAME}"
|
||||
|
||||
# 开发环境自动配置 mock login(带随机密钥)
|
||||
if [ "${APP_ENV}" = "development" ]; then
|
||||
local has_mock; has_mock=$(remote "grep -c 'MOCK_LOGIN_ENABLED' /etc/systemd/system/${SERVICE_NAME} 2>/dev/null || echo 0")
|
||||
if [ "$has_mock" = "0" ]; then
|
||||
local mock_key; mock_key=$(openssl rand -base64 12 2>/dev/null | tr -d '\n' || echo "dev-mock-$(date +%s)")
|
||||
remote "sed -i '/^\[Service\]/a Environment=MOCK_LOGIN_ENABLED=true\nEnvironment=MOCK_LOGIN_KEY=${mock_key}' /etc/systemd/system/${SERVICE_NAME}"
|
||||
log_info "自动配置 MOCK_LOGIN_ENABLED=true, MOCK_LOGIN_KEY=${mock_key}"
|
||||
fi
|
||||
fi
|
||||
|
||||
remote "systemctl daemon-reload"
|
||||
log_info "service 文件部署完成,使用 systemctl restart ${SERVICE_NAME} 重启"
|
||||
}
|
||||
|
||||
@@ -231,18 +231,34 @@ pub struct MockLoginResponse {
|
||||
|
||||
/// GET /api/mock-login
|
||||
/// 沙箱测试用:无需微信 code,直接返回 JWT
|
||||
/// 通过环境变量 MOCK_LOGIN_ENABLED 控制是否启用
|
||||
/// 通过环境变量 MOCK_LOGIN_ENABLED + MOCK_LOGIN_KEY 控制启用
|
||||
/// MOCK_LOGIN_ENABLED=true 且未设 MOCK_LOGIN_KEY:任何请求可用(不安全)
|
||||
/// MOCK_LOGIN_ENABLED=true 且设了 MOCK_LOGIN_KEY:需携带 X-Mock-Key 请求头
|
||||
#[get("/api/mock-login")]
|
||||
pub async fn mock_login(
|
||||
pool: web::Data<PgPool>,
|
||||
query: web::Query<MockLoginRequest>,
|
||||
app_state: web::Data<AppState>,
|
||||
req: HttpRequest,
|
||||
) -> impl Responder {
|
||||
// 检查是否启用
|
||||
if std::env::var("MOCK_LOGIN_ENABLED").ok() != Some("true".to_string()) {
|
||||
return HttpResponse::NotFound().json(ErrorResponse::<()>::error("模拟登录未启用"));
|
||||
}
|
||||
|
||||
// 如果设置了 MOCK_LOGIN_KEY,验证请求头
|
||||
if let Ok(key) = std::env::var("MOCK_LOGIN_KEY") {
|
||||
if !key.is_empty() {
|
||||
let header_key = req.headers()
|
||||
.get("X-Mock-Key")
|
||||
.and_then(|v| v.to_str().ok())
|
||||
.unwrap_or("");
|
||||
if header_key != key {
|
||||
return HttpResponse::Forbidden().json(ErrorResponse::<()>::error("模拟登录密钥错误"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let user_id = match query.user_id {
|
||||
Some(id) => {
|
||||
// 验证用户存在
|
||||
|
||||
Reference in New Issue
Block a user