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 32Ora 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