P0-3 (часть 2): не отдавать пароль устройства повторно через GET

GetIoTDevice больше не возвращает mqtt_password (deviceToResponse получает ).
Пароль остаётся доступен только один раз — при создании устройства.
Хэширование паролей в БД + перевод EMQX на алгоритм хэша (часть 1) требует
изменения emqx.conf и миграции — отдельным шагом.
This commit is contained in:
Repinoid
2026-10-06 19:06:02 +03:00
parent c97b63b190
commit a4e786d03b
+6 -3
View File
@@ -34,7 +34,9 @@ type iotDeviceUpdateRequest struct {
Enabled *bool `json:"enabled"` Enabled *bool `json:"enabled"`
} }
// iotDeviceResponse — ответ API. MQTTPassword — только в GET по имени. // iotDeviceResponse — ответ API. MQTTPassword заполняется ТОЛЬКО при создании
// устройства (отдаётся один раз) и НИКОГДА при чтении — чтобы пароль не утекал
// через GET и не хранился в логах/истории.
type iotDeviceResponse struct { type iotDeviceResponse struct {
Name string `json:"name"` Name string `json:"name"`
Namespace string `json:"namespace"` Namespace string `json:"namespace"`
@@ -50,7 +52,8 @@ type iotDeviceResponse struct {
} }
// deviceToResponse конвертирует устройство из БД в ответ API. // deviceToResponse конвертирует устройство из БД в ответ API.
// password отдаётся только если непустая (передаётся явно из Get). // password отдаётся только если непустая — только на создании, при чтении
// передаётся пустая строка (пароль повторно не показывается).
func deviceToResponse(d *store.Device, password string) iotDeviceResponse { func deviceToResponse(d *store.Device, password string) iotDeviceResponse {
resp := iotDeviceResponse{ resp := iotDeviceResponse{
Name: d.Name, Name: d.Name,
@@ -193,7 +196,7 @@ func (h *Handler) GetIoTDevice(w http.ResponseWriter, r *http.Request) {
return return
} }
writeJSON(w, http.StatusOK, deviceToResponse(device, device.MQTTPassword)) writeJSON(w, http.StatusOK, deviceToResponse(device, ""))
} }
// DeleteIoTDevice — DELETE /v1/namespaces/{ns}/iot/devices/{name}. // DeleteIoTDevice — DELETE /v1/namespaces/{ns}/iot/devices/{name}.