nginx: attivare un token per le chiamate api

E’ possibile utilizzare nginx come webserver ma spesso anche come reverse proxy.

In modo molto semplice è possibile usare direttamente nginx per attivare la verifica sul passaggio di un parametro token sulle richieste.

Nel file di configurazione del virtualhost definiamo innanzitutto il recupero del token:

# Estraggo il token Bearer dall'header Authorization
map $http_authorization $bearer_token {
         default         "";
         "~*^Bearer\s+(.+)$"  $1;
}

# Mappa il token: accetta header X-API-Token, query param ?token=, oppure Authorization: Bearer
# la regex sulla seconda map usa ~* (case-insensitive), sostituire ~* con ~ per case-sensitive
map "$http_x_api_token$arg_token$bearer_token" $auth_token_valid {
        default             0;
        #"~*${SHARED_TOKEN}"  1;
        "~*XXXXXXXXXXXXX" 1;
}

dove XXXXXXXXXXXXX è il nostro token che possiamo generare facilmente con:

openssl rand -hex 32

Ora nella rotta da proteggere, ipotizziamo tutto /, inseriamo la verifica del token:

        location / {
            # Verifica token
            if ($auth_token_valid = 0) {
                return 401 '{"error":"Unauthorized: missing or invalid token"}';
            }
...
...

e se nginx è usato come reverse proxy, inserire sotto la parte di verifica del token anche:

            # Rimuove il query param ?token= prima di passare al backend
            set $clean_uri $request_uri;
            # Rimuove il token dall'header verso il backend
            proxy_set_header X-API-Token "";

Bene, ora basterà aggiungere l’header X-API-Token, ad esempio:

curl "https://url_sito_web" -H "X-API-Token: XXXXXXXXX"

oppure il parametro ?token= nell’url:

curl "https://url_sito_web?token= XXXXXXXXX"

oppure (ad esempio per Ollama) modalità OpenAI compatibile:

curl "https://url_sito_web" -H "Authorization: Bearer XXXXXXXXX"

Escludere le chiamate GET ed HEAD dalla verifica token

Partendo dalla configurazione precedente, se volessimo escludere le chiamate di tipo GET e HEAD dalla verifica del token, potremmo modificare la configurazione come segue:

Sotto il blocco map precedente in cui estraiamo la variabile $auth_token_valid, aggiungiamo l’estrazione di una nuova variabile $auth_is_valid:

# Bypass auth per GET/HEAD, altrimenti controlla il token
map $request_method $auth_is_valid {
    default $auth_token_valid; # POST, PUT, DELETE, ecc. → controlla token
    GET 1; # GET → sempre autorizzato
    HEAD 1; # HEAD → sempre autorizzato (opzionale)
}

e poi modifichiamo il blocco di verifica dentro location, controllando $auth_is_valid piuttosto che $auth_token_valid così:

    location / {
      # Verifica token
      if ($auth_is_valid = 0) {
        return 401 '{"error":"Unauthorized: missing or invalid token"}';
      }

Nota

Se bisogna escludere i GET solo su certi path e non globalmente, si può anche fare con una location separata:

# Path pubblici in GET (es. /api/models, /api/tags)
location ~* ^/(api/models|api/tags) {
    limit_except GET { deny all; }  # solo GET ammesso senza token
    # ... proxy pass
}


enjoy!

Ti interessa acquistare un dominio a prezzi ultraconvenienti? clicca qui

Se hai trovato utili le informazioni su questo blog,
Fai una donazione!
Clicca sul bottone qui sotto o almeno clicca sul banner pubblicitario 🙂



Commenta