diff --git a/internal/service/api/handler/devices.go b/internal/service/api/handler/devices.go index 9690398..be3094f 100644 --- a/internal/service/api/handler/devices.go +++ b/internal/service/api/handler/devices.go @@ -34,7 +34,9 @@ type iotDeviceUpdateRequest struct { Enabled *bool `json:"enabled"` } -// iotDeviceResponse — ответ API. MQTTPassword — только в GET по имени. +// iotDeviceResponse — ответ API. MQTTPassword заполняется ТОЛЬКО при создании +// устройства (отдаётся один раз) и НИКОГДА при чтении — чтобы пароль не утекал +// через GET и не хранился в логах/истории. type iotDeviceResponse struct { Name string `json:"name"` Namespace string `json:"namespace"` @@ -50,7 +52,8 @@ type iotDeviceResponse struct { } // deviceToResponse конвертирует устройство из БД в ответ API. -// password отдаётся только если непустая (передаётся явно из Get). +// password отдаётся только если непустая — только на создании, при чтении +// передаётся пустая строка (пароль повторно не показывается). func deviceToResponse(d *store.Device, password string) iotDeviceResponse { resp := iotDeviceResponse{ Name: d.Name, @@ -193,7 +196,7 @@ func (h *Handler) GetIoTDevice(w http.ResponseWriter, r *http.Request) { return } - writeJSON(w, http.StatusOK, deviceToResponse(device, device.MQTTPassword)) + writeJSON(w, http.StatusOK, deviceToResponse(device, "")) } // DeleteIoTDevice — DELETE /v1/namespaces/{ns}/iot/devices/{name}.