Come strutturare il servizio API REST che accetta i parametri POST nel corpo

1

Tutto ciò che ho letto dice di passare parametri a un servizio REST nell'URI, sia per modello, sia per stringa di query:

https://www.myapp/my/login/api/authenticate/ganders/mypassword

o

https://www.myapp/my/login/api/authenticate?user=ganders&password=mypassword

Ma ovviamente quelli stanno esponendo il mio nome utente e password in chiaro.

Il nostro addetto alla sicurezza sta dicendo che dobbiamo passare i parametri nel corpo della richiesta. Come lo faccio? Gli esempi, o solo un link ad un esempio, sono sufficienti perché apparentemente le mie competenze su google non sono molto alte.

Una cosa che ho trovato finora è che se decori i tuoi metodi di servizio con l'attributo [FromBody], come questo:

public AuthenticationResult Authenticate(**[FromBody]**LoginData loginData)
{
    return AuthenticationResult.Authenticated;
}

che li afferrerà dal corpo. Il mio altro compito è provare a testarlo? È un compito per Fiddler? Oppure gli strumenti Dev Chrome?

Un'altra cosa che ho trovato finora è che puoi avere solo 1 parametro nel post, è esatto?

Ci dispiace, molte domande qui. Ho passato tutto il giorno ieri cercando di fare ricerche su questo e ovviamente non sono andato molto lontano ...

Modifica:

Quindi ecco quello che ho finora, questa è la versione "GET" che abbiamo bisogno di convertire in un POST (questa è l'API C # REST chiamata angolare)

$http.defaults.headers.common.Authorization = 'Basic ' + encoded;

var url = $rootScope.serviceBaseUrl + "login/get" + "?username=" + user + "&password=" + password + "&accesstoken=";

$http({method: 'Get', url: url}).success(.....).error(......);

E il servizio REST:

[HttpGet]
    public AuthenticationResult Get([FromUri]LoginModel login)
    {
        try
        {
            AuthenticationService authService = new AuthenticationService();
            AuthenticationResult result = authService.IsAuthenticated(login);

            if (result.IsAuthenticated)
                return result;
            else
            {
                return new AuthenticationResult()
                {
                    IsAuthenticated = false,
                    User = new User()
                    {
                        UserId = login.Username
                    }
                };
            }
        }
        catch(Exception ex)
        {
            return new AuthenticationResult()
            {
                IsAuthenticated = false,
                User = new User()
                {
                    UserId = login.Username,
                    Token = ex.Message
                }
            };
        }
    }

Modifica2: mi sto avvicinando. Ho la risposta da trasmettere (tramite Fiddler), ma il mio array JSON di dati che sto passando non viene mappato sul mio tipo complesso. Ecco cosa ho:  In Fiddler:

User-Agent: Fiddler
Host: localhost:42761
Content-Length: 73
Content-Type: application/json
Accept: application/json

"Corpo richiesta":

{
"Username": "ganders",
"Password": "hashedPassword"
}

Il mio oggetto "LoginData" è istanziato sul lato del servizio, ma le mie due proprietà sono nulle ...

    
posta ganders 24.06.2014 - 16:54
fonte

2 risposte

2

Lo strutturerei spostandolo all'interno dei campi JSON se l'autenticazione di base HTTP non è un'opzione.

Ad esempio:

POST https://my.server/login
{ "username": "user",
  "secret": "someSecureHashAndNotThePlaintextPasswordSeriouslyDontDoThat" }
    
risposta data 24.06.2014 - 17:02
fonte
3

Everything I've read says to pass parameters to a REST service in the URI, whether by template, or query string:

Nessuno che comprenda REST lo consiglierebbe.

L'URL (localizzatore di risorse uniformi) è un sottotipo di URI (identificatore di risorse uniformi). Un URL è pensato per essere una stringa che rappresenta l'identità della risorsa con cui stai interagendo; un URL quindi deve contenere tutto ciò che è necessario per identificare una risorsa e nient'altro. Mentre il nome utente di uno può essere considerato parte dell'identità della risorsa utente, una password non deve e non deve essere trovata in nessun punto dell'URL.

Il modo REST / HTTP ideale per accedere al servizio è tramite le intestazioni Autenticazione / Autorizzazione WWW. Se non è assolutamente possibile implementarlo come Autorizzazione, una soluzione accettabile potrebbe essere POST a una risorsa di autenticazione /login/ e avere sia il nome utente sia la password contenuti nel corpo; o per POST alla risorsa utente /users/username con la password nel corpo. Se utilizzare la codifica URL o JSON o XML o altri formati per il tipo di contenuto della richiesta, non importa in REST, sceglierne uno più conveniente. In nessun caso la password deve essere nell'URL. Ciò è indipendente dalle considerazioni sulla sicurezza che possono sorgere quando si inserisce la password nell'URL a causa della registrazione o delle cache.

    
risposta data 24.06.2014 - 21:13
fonte

Leggi altre domande sui tag