2015-10-18 2 views
12

Cercare una buona spiegazione su come eseguire l'autenticazione tramite akka HTTP. Dato un percorso che assomigliaCome eseguire l'autenticazione tramite Akka HTTP

val route = 
    path("account") { 
    authenticateBasic(realm = "some realm", myAuthenticator) { user => 
     get { 
     encodeResponseWith(Deflate) { 
      complete { 
      //do something here 
      } 
     } 
     } 
    } 
    } 

The documentation delinea un modo, ma poi viene omesso la parte pertinente esegue l'autenticazione reale ...

// backend entry points 
def myAuthenticator: Authenticator[User] = ??? 

Dove posso trovare un esempio di implementazione di un tale autenticatore ? Ho già la logica per autenticare un utente con un nome utente e una password, ma quello che non riesco a capire è come ottenere un nome utente/password (o un token che contiene entrambi) dalla richiesta HTTP (o RequestContext).

risposta

8

Authenticator è solo una funzione UserCredentials => Option[T], dove UserCredentials in caso di essere (verificare con pattern matching) Provided avere verifySecret(secret) metodo che è necessario chiamare e tornare Some (Alcuni utenti, per esempio) in caso di successo, come in tutta sicurezza:

def myAuthenticator: Authenticator[User] = { 
    case [email protected](username) => 
    if(p.verifySecret(myGetSecret(username))) Some(username) else None 
    case Missing => None //you can throw an exeption here to get customized response otherwise it will be regular `CredentialsMissing` message 

} 

myGetSecret è la funzione personalizzata che ottiene il nome utente e restituisce il tuo segreto (ad esempio la password), recuperandolo dal database. verifySecret confronterà in modo sicuro (per evitare attacchi temporali) fornendo la password con la password da myGetSecret. In generale, "segreto" è qualsiasi informazione nascosta (come hash di credenziali o token), ma in caso di autenticazione di base è solo una semplice password estratta da intestazioni http.

Se è necessario un approccio più personalizzato, utilizzare authenticateOrRejectWithChallenge che ottiene HttpCredentials come input, in modo da poter estrarre la password fornita da lì.

Ulteriori informazioni sull'autorizzazione sono in scaladocs.

+0

questo sta facendo più senso, ma non capisco la linea 'if (p.verifySecret (myGetSecret (nome utente))' Qualche possibilità si potrebbe spiegare un po 'di chiamate segrete? – mattmar10

+1

@ user1551604 ' myGetSecret' è la tua funzione personalizzata che ottiene 'username' e restituisce il tuo segreto (ad es. password), ottenendolo possibilmente dal database.' verifySecret' confronterà in modo sicuro (per evitare l'attacco temporale) fornita la password con myGetSecret – dk14

+0

grazie per l'aggiunta Questo aiuta un po ', quindi qual è il parametro nella funzione 'myGetSecret'? Suppongo che sia solo una stringa? Cosa deve restituire? Ho la password per gli utenti archiviati (in formato hash con BCrypt). sarebbe la password unhashed? – mattmar10