15

akka HTTP を使用して認証を行う方法についての適切な説明を探しています。次のようなルートが与えられた場合

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

ドキュメントには方法の概要が記載されていますが、実際の認証を実行する関連部分は省略されています...

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

このようなオーセンティケーターの実装例はどこにありますか? ユーザー名とパスワードを指定してユーザーを認証するためのロジックは既にありますが、HTTP 要求 (または RequestContext) からユーザー名/パスワード (または両方を含むトークン) を取得する方法がわかりません。

4

1 に答える 1

11

Authenticator は単なる関数UserCredentials => Option[T]でありUserCredentials、(パターン マッチングでチェック) 成功した場合に安全に呼び出して (たとえば一部のユーザー) を返す必要があるメソッドをProvided持っている場合は、次のようになります。verifySecret(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、getsHttpCredentialsを入力として使用すると、そこから提供されたパスワードを抽出できます。

承認に関する詳細情報はscaladocs にあります。

于 2015-10-19T02:10:36.933 に答える