2015-10-18 15 views
12

尋找關於如何使用akka HTTP進行身份驗證的很好的解釋。由於看起來像如何使用Akka HTTP進行身份驗證

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

The documentation概括的方式,但隨後被省略執行實際認證的相關部分在哪裏可以找到這樣的認證的示例實現的路線......

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

?我已經有了用於給定用戶名和密碼的用戶身份驗證的邏輯,但我無法弄清楚如何從HTTP請求(或RequestContext)獲取用戶名/密碼(或包含兩者的令牌)。

回答

8

認證者僅僅是一個函數UserCredentials => Option[T],其中UserCredentials在被情況下(與模式匹配檢查)ProvidedverifySecret(secret)方法,您需要安全地調用,並在成功的情況下返回Some(有些用戶爲例),如:

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是您的自定義函數,它獲取用戶名並返回您的祕密(例如密碼),從數據庫中獲取它。 verifySecret將從myGetSecret安全地比較(以避免計時攻擊)提供的密碼與您的密碼。通常,「祕密」是任何隱藏信息(如憑證或令牌的哈希),但在基本身份驗證的情況下,它只是從http頭中提取的簡單密碼。

如果您需要更多的定製方法 - 使用authenticateOrRejectWithChallenge可獲得HttpCredentials作爲輸入,所以您可以從那裏提取提供的密碼。

有關授權的更多信息是in scaladocs

+0

這使得更多的意義,但我不明白的線 '如果(p.verifySecret(myGetSecret(用戶名))' 任何機會,你能解釋一下有關的祕密電話? – mattmar10

+1

@ user1551604' myGetSecret'是你的自定義函數,它可以獲取'username'並返回你的祕密(例如密碼),從數據庫中獲取它。'verifySecret'將安全地比較(避免計時攻擊)提供密碼myGetSecret – dk14

+0

謝謝你添加那麼它有一點幫助,那麼myGetSecret函數的參數是什麼?我猜這只是一個字符串?它應該返回什麼?我有用於存儲用戶的密碼(以使用BCrypt的散列形式),因此,會不會是密碼? – mattmar10

相關問題