fix: mock_login支持X-Mock-Key请求头鉴权 + deploy自动配置随机密钥
This commit is contained in:
@@ -106,6 +106,17 @@ deploy_service_file() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
rsync -avzP "$(get_service_file_local)" "${REMOTE_USER}@${REMOTE_HOST}:/etc/systemd/system/${SERVICE_NAME}"
|
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"
|
remote "systemctl daemon-reload"
|
||||||
log_info "service 文件部署完成,使用 systemctl restart ${SERVICE_NAME} 重启"
|
log_info "service 文件部署完成,使用 systemctl restart ${SERVICE_NAME} 重启"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -231,18 +231,34 @@ pub struct MockLoginResponse {
|
|||||||
|
|
||||||
/// GET /api/mock-login
|
/// GET /api/mock-login
|
||||||
/// 沙箱测试用:无需微信 code,直接返回 JWT
|
/// 沙箱测试用:无需微信 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")]
|
#[get("/api/mock-login")]
|
||||||
pub async fn mock_login(
|
pub async fn mock_login(
|
||||||
pool: web::Data<PgPool>,
|
pool: web::Data<PgPool>,
|
||||||
query: web::Query<MockLoginRequest>,
|
query: web::Query<MockLoginRequest>,
|
||||||
app_state: web::Data<AppState>,
|
app_state: web::Data<AppState>,
|
||||||
|
req: HttpRequest,
|
||||||
) -> impl Responder {
|
) -> impl Responder {
|
||||||
// 检查是否启用
|
// 检查是否启用
|
||||||
if std::env::var("MOCK_LOGIN_ENABLED").ok() != Some("true".to_string()) {
|
if std::env::var("MOCK_LOGIN_ENABLED").ok() != Some("true".to_string()) {
|
||||||
return HttpResponse::NotFound().json(ErrorResponse::<()>::error("模拟登录未启用"));
|
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 {
|
let user_id = match query.user_id {
|
||||||
Some(id) => {
|
Some(id) => {
|
||||||
// 验证用户存在
|
// 验证用户存在
|
||||||
|
|||||||
Reference in New Issue
Block a user