feat: Auto Read-only API-Key bei Kunden-Erstellung
- createCustomer erstellt automatisch einen customer-scoped Read-only Key - Response gibt Customer + neuen API-Key zurueck - Bestehende 4 Kunden Keys nachtraglich erstellt
This commit is contained in:
parent
f658f3c4db
commit
15ad9be8e7
@ -1,11 +1,28 @@
|
|||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/rand"
|
||||||
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/cynfo/rmm-backend/db"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// generateCustomerAPIKey erstellt automatisch einen Read-only Key fuer einen Kunden
|
||||||
|
func generateCustomerAPIKey(database *db.Database, customerID int, number, name string) (*db.APIKey, error) {
|
||||||
|
b := make([]byte, 16)
|
||||||
|
if _, err := rand.Read(b); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
key := hex.EncodeToString(b)
|
||||||
|
keyName := fmt.Sprintf("Read-only — %s %s", number, name)
|
||||||
|
return database.CreateAPIKey(keyName, key, "read", &customerID)
|
||||||
|
}
|
||||||
|
|
||||||
// GET /api/v1/customers
|
// GET /api/v1/customers
|
||||||
func (h *Handler) listCustomers(w http.ResponseWriter, r *http.Request) {
|
func (h *Handler) listCustomers(w http.ResponseWriter, r *http.Request) {
|
||||||
customers, err := h.db.GetCustomers()
|
customers, err := h.db.GetCustomers()
|
||||||
@ -31,8 +48,22 @@ func (h *Handler) createCustomer(w http.ResponseWriter, r *http.Request) {
|
|||||||
writeError(w, http.StatusInternalServerError, "Kunde anlegen fehlgeschlagen")
|
writeError(w, http.StatusInternalServerError, "Kunde anlegen fehlgeschlagen")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Automatisch einen Read-only API-Key fuer den neuen Kunden erstellen
|
||||||
|
apiKey, keyErr := generateCustomerAPIKey(h.db, c.ID, req.Number, req.Name)
|
||||||
|
if keyErr != nil {
|
||||||
|
log.Printf("Auto-API-Key fuer Kunde %s fehlgeschlagen: %v", req.Number, keyErr)
|
||||||
|
}
|
||||||
|
|
||||||
h.auditLog(r, "customer.create", "customer", req.Number, req.Name, "")
|
h.auditLog(r, "customer.create", "customer", req.Number, req.Name, "")
|
||||||
writeJSON(w, http.StatusCreated, c)
|
|
||||||
|
resp := map[string]interface{}{
|
||||||
|
"customer": c,
|
||||||
|
}
|
||||||
|
if apiKey != nil {
|
||||||
|
resp["api_key"] = apiKey
|
||||||
|
}
|
||||||
|
writeJSON(w, http.StatusCreated, resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GET /api/v1/customers/{id}
|
// GET /api/v1/customers/{id}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user