Esiste un'alternativa valida alle intestazioni HTTP per l'invio di credenziali di autenticazione

0

Ho creato un'autenticazione semplice per i server REST nei progetti accademici. Ho sempre usato le intestazioni per trasmettere le credenziali. Questo è probabilmente solo perché ogni tutorial che abbia mai visto è stato così. Inizialmente, avrei i campi di intestazione per user e password , ma alla fine sono passato all'autenticazione di base. Comunque, qualunque cosa fosse, l'ho sempre passato nelle intestazioni. La mia impressione era che questo fosse l'unico modo corretto.

Il team della piattaforma mi ha detto che è necessario registrare tutte le intestazioni di ciascuna richiesta ricevuta, senza eccezioni, quindi non utilizzare le intestazioni per accettare informazioni riservate, ad esempio una password. Mi è stato mostrato un esempio di API REST costruita da un altro team. Per i metodi POST e PUT, la stringa di autenticazione è stata accettata nel corpo del messaggio. Per i metodi GET e DELETE, era nella query URL. Questo mi sembra sbagliato, ma non posso spiegare esattamente perché.

Sto cercando di capire se dovrei combattere contro questa politica. Mi piacerebbe scoprire se la mia posizione è corretta e, in tal caso, come supportarla quando parlo con la leadership.

  • Ho ragione nel ritenere che le intestazioni HTTP siano l'unico modo corretto per passare le credenziali di autenticazione in un'API REST stateless?
  • Sono sicuro che usare i parametri della query URL sia pericolosamente insicuro o altrimenti sconsigliabile?
  • Se ho ragione, c'è qualche fonte autorevole a cui posso fare riferimento quando porto il caso alla mia guida? (Oltre a RFC 7235, l'ho letto. È troppo tecnico per le persone che devo convincere.)
posta ds390s 20.01.2018 - 01:50
fonte

2 risposte

3
  • Ho ragione nel ritenere che le intestazioni HTTP siano l'unico modo corretto per passare le credenziali di autenticazione in un'API REST stateless?

No. REST in realtà non indirizza l'autenticazione e OAuth utilizza la stringa di query e gli organismi POST per ottenere le credenziali. Un'intestazione viene utilizzata per il token di accesso, ma questo non contiene alcuna password.

  • Sono sicuro che usare i parametri della query URL sia pericolosamente insicuro o altrimenti sconsigliabile?

Hmmmmm. HTTPS crittografa la stringa di query. Anche se, ovviamente, se qualcuno è in piedi dietro di te, può vedere cose nella barra degli indirizzi

  • Se ho ragione, c'è qualche fonte autorevole a cui posso fare riferimento quando porto il caso alla mia guida? (Oltre a RFC 7235, l'ho letto. È troppo tecnico per le persone che devo convincere.)

In realtà non dovresti inviare nomi utente e password a singoli servizi. Chiedi al tuo cliente di ottenere un token di accesso dal server di autenticazione usando le richieste POST Body.

Quindi puoi passarlo a vari servizi che possono controllare la sua firma contro la chiave pubblica.

È valido per registrare questi token, poiché scadono in pochi secondi, quindi puoi tenerli nelle intestazioni come al solito.

    
risposta data 20.01.2018 - 16:29
fonte
1

I am trying to figure out if I should fight against this policy.

Cambia la tua organizzazione o cambia la tua organizzazione.

La politica sembra molto sbagliata, in un contesto generale . Potrebbe avere senso date le circostanze. Non vorrei mai sostenere quelle pratiche in un sistema in fase di costruzione da zero, ma potrebbe essere una soluzione pratica dati i vincoli locali.

Fielding ha scritto nel 2008

REST is intended for long-lived network-based applications that span multiple organizations. If you don’t see a need for the constraints, then don’t use them.

REST è stato progettato per la creazione di applicazioni su scala web; per esempio, il world wide web. Una parte importante di questo progetto era prestare attenzione ai componenti generici e sapere cosa potevano sapere sui messaggi che venivano trasmessi. Le intestazioni HTTP sono effettivamente metadati in modo che i componenti generici sappiano cosa sta succedendo. Questo a sua volta offre varie ottimizzazioni come il caching.

Il che significa che se non si inseriscono le informazioni di autenticazione nel messaggio in cui si aspettano i componenti generici, non vedranno tali informazioni e non reagiranno in modo appropriato.

Vedi RFC 7234, Memorizzazione di risposte a richieste autenticate .

Ora, questo argomento in particolare è un po 'più debole di vent'anni fa, perché probabilmente utilizzeremo una connessione crittografata per scambiare i messaggi. In tali circostanze, le capacità degli intermediari sono meno preoccupanti, perché non dovrebbero essere comunque in grado di leggere i messaggi.

For POST and PUT methods, the auth string was accepted in the message body. For GET and DELETE methods, it was in the URL query. This seems wrong to me, but I can't exactly explain why.

In senso stretto, l'incorporamento dei dati di autenticazione nel payload di una richiesta PUT è semanticamente errato

The PUT method requests that the state of the target resource be created or replaced with the state defined by the representation enclosed in the request message payload.

A meno che l'obiettivo non sia includere le informazioni di autenticazione nella rappresentazione aggiornata della risorsa, non ci appartiene.

Mettere le credenziali di autenticazione nella parte di query dell'URI nella richiesta è "errato" perché l'URI è un identificatore - /foo/bar?user=alice è una risorsa diversa da /foo/bar?user=bob . Il fatto che queste due risorse abbiano sempre la stessa rappresentazione e che l'eliminazione di una ne cancella necessariamente l'altra, è un dettaglio di implementazione che non è visibile all'esterno del server.

Mi sembra che il tuo team non stia cercando di fare REST, ma sta invece implementando un protocollo RPC usando HTTP come trasporto per i messaggi. Che va bene se non hanno bisogno delle proprietà di ridimensionamento protette dallo stile architettonico REST.

Is there a valid alternative to HTTP headers for sending auth credentials

I certificati client sarebbero un altro approccio; vale a dire, il client e il server negoziano una connessione crittografata e il server sa chi è il client perché le risposte fornite dal client sono coerenti con la chiave pubblica nota del client (il che implica che il client abbia accesso alla chiave privata) .

(Non c'è davvero niente di sbagliato nel mettere le credenziali di autenticazione nel corpo del POST. POST è così generico non importa, le componenti intermedie non sono in grado di trarre molte conclusioni quando la semantica è specificata in modo approssimativo, ma è un po 'maldestro, immagina una pagina web in cui ogni link è stato sostituito con un modulo. / p>     

risposta data 20.01.2018 - 16:00
fonte

Leggi altre domande sui tag