如何使用Akka HTTP

时间:2015-10-18 21:13:05

标签: scala akka 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)获取用户名/密码(或包含两者的令牌)。

1 个答案:

答案 0 :(得分:9)

Authenticator只是一个函数UserCredentials => Option[T],其中UserCredentials如果是(检查模式匹配)ProvidedverifySecret(secret)方法,您需要安全地调用并返回Some(例如某些用户)如果成功,例如:

def myAuthenticator: Authenticator[User] = {
  case p@Provided(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