HTTP di base e autenticazione del token di portatore


115

Attualmente sto sviluppando un'API REST che è protetta da HTTP di base per l'ambiente di sviluppo. Poiché la vera autenticazione viene eseguita tramite un token, sto ancora cercando di capire come inviare due intestazioni di autorizzazione.

Ho provato questo:

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Authorization: Bearer mytoken123"

Ad esempio, potrei disabilitare l'autenticazione HTTP per il mio IP ma poiché di solito lavoro in ambienti diversi con IP dinamici, questa non è una buona soluzione. Quindi mi sto perdendo qualcosa?


2
Devo autenticarmi tramite HTTP Basic poiché il server Dev è protetto con esso e ho bisogno dell'autenticazione basata su token per l'API. Ma poiché uso curl per testare l'API, ho bisogno di un modo per inviare entrambe le intestazioni di autenticazione. Quindi il primo (di base) per passare HTTP di base e il secondo (token) per autenticarsi alla mia applicazione. E sì, è una mia creazione.
Azngeek

1
Hai mai capito questo? Sto aggiungendo una taglia
Adam Waite

4
Ciao Adam, purtroppo no. Ora ho cambiato il modo in cui funziona l'autenticazione cambiando la mia intestazione di autorizzazione per il token in "x-auth" che non è un'intestazione standard.
Azngeek

1
Il mio server nginx non accetterà nemmeno 2 intestazioni di autorizzazione. Restituisce un file 400 Bad request. Silly.
Rudie

1
Cosa c'è di sbagliato nell'usare un'intestazione personalizzata per il tuo token API? Non vedo perché le persone qui hanno "scartato" utilizzando HTTP Basic Auth per mantenere i loro server di sviluppo / gestione temporanea lontano da occhi indiscreti.
Sunil D.

Risposte:


68

Prova questo per eseguire il push dell'autenticazione di base all'URL:

curl -i http://username:password@dev.myapp.com/api/users -H "Authorization: Bearer mytoken123"
               ^^^^^^^^^^^^^^^^^^

Se uno sopra non funziona, non hai niente a che fare con esso. Quindi prova le seguenti alternative.

Puoi passare il token con un altro nome. Perché stai gestendo l'autorizzazione dalla tua applicazione. Quindi puoi facilmente utilizzare questa flessibilità per questo scopo speciale.

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Application-Authorization: mytoken123"

Notare che ho cambiato l'intestazione in Application-Authorization. Quindi dalla tua applicazione prendi il token sotto quell'intestazione ed elabora ciò che devi fare.

Un'altra cosa che puoi fare è passare tokenattraverso i POSTparametri e prendere il valore del parametro dal lato Server. Ad esempio, passando il token con il parametro curl post:

-d "auth-token=mytoken123"

1
Ciao Sabuj, il problema non è il modo in cui passi il nome utente e la password, ma più intestazioni di autorizzazione semplicemente non funzionano. Guardando le specifiche ( ietf.org/rfc/rfc2617.txt ) posso vedere che questo dovrebbe essere possibile. Ma come affermato anche "" L'agente utente DEVE scegliere di utilizzare una delle sfide con lo schema di autorizzazione più forte che comprende e richiedere le credenziali dell'utente in base a quella sfida. "Quindi, come ho scritto 2 giorni fa, avevo bisogno di superare il token a un'intestazione non standard che va assolutamente bene quando si ha a che fare con architetture non standard.
Azngeek

5
@Azngeek Curl invia entrambe le intestazioni di autorizzazione quando esegui l'attività. Devi gestirlo dalla parte del tuo server. Basta eseguire il comando curl con entrambe le intestazioni con -vparam. Scoprirai che viene inviato Authorization: Basic Ym9zY236Ym9zY28=, Authorization: Bearer mytoken123nell'intestazione della richiesta. Dall'estremità del server, se controlli, scoprirai di avere un'intestazione di autorizzazione in questo modo Authorization: Basic Ym9zY236Ym9zY28=, Bearer mytoken123separata da virgola. Quindi, ho pensato di suggerirti delle alternative.
Sabuj Hassan

34

Standard ( https://tools.ietf.org/html/rfc6750 ) dice che puoi usare:

  • Parametro del corpo con codifica in forma: Autorizzazione: Bearer mytoken123
  • Parametro query URI: access_token = mytoken123

Quindi è possibile passare molti Bearer Token con URI, ma è sconsigliato farlo (vedere la sezione 5 dello standard).


4

Se stai utilizzando un proxy inverso come nginx in mezzo, puoi definire un token personalizzato, come X-API-Token.

In nginx dovresti riscriverlo per il proxy upstream (la tua rest api) per essere solo auth:

proxy_set_header Authorization $http_x_api_token;

... mentre nginx può utilizzare l'intestazione di autorizzazione originale per controllare HTTP AUth.


3

Ho avuto un problema simile: autenticare il dispositivo e l'utente sul dispositivo. Ho usato Cookieun'intestazione accanto a Authorization: Bearer...un'intestazione.


Non è chiaro il motivo del voto negativo. Mi sono imbattuto in questa domanda cercando una risposta a un problema correlato: è così che l'ho risolto. L' Cookieintestazione è già utilizzata frequentemente per l'autenticazione.
Iiridayn

2

curl - qualunque

Indica a curl di capire da solo il metodo di autenticazione e di utilizzare quello più sicuro che il sito remoto dichiara di supportare. Questo viene fatto eseguendo prima una richiesta e controllando le intestazioni di risposta, inducendo così probabilmente un round trip di rete aggiuntivo. Viene usato invece di impostare un metodo di autenticazione specifico, che puoi fare con --basic, --digest, --ntlm e --negotiate.


1

Esiste un'altra soluzione per testare le API sul server di sviluppo.

  • Impostato HTTP Basic Authenticationsolo per percorsi web
  • Lascia tutte le route API libere dall'autenticazione

Configurazione del server Web per nginxe Laravelsarebbe così:

    location /api {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;

        auth_basic "Enter password";
        auth_basic_user_file /path/to/.htpasswd;
    }

Authorization: Bearer farà il lavoro di difendere il server di sviluppo da crawler web e altri visitatori indesiderati.


0

Con nginx puoi inviare entrambi i token in questo modo (anche se è contro lo standard):

Authorization: Basic basic-token,Bearer bearer-token

Questo funziona finché il token di base è il primo: nginx lo inoltra correttamente al server delle applicazioni.

E poi devi assicurarti che la tua applicazione possa estrarre correttamente il Bearer dalla stringa sopra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.