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"`
}
// 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}.