5

私のPlackアプリで、ユーザーを承認するいくつかの異なる方法を試してもらいたいです。具体的には、ユーザーがセッション cookie を介して既に承認されているかどうかを確認し、Digest 認証を確認してから Basic にフォールバックします。

私は、チェックしたい順序 (セッション、ダイジェスト、ベーシック) で一連の Auth ハンドラーを有効にできると考えました。残念ながら、Plack::Middleware::Auth::DigestPlack::Middleware::Auth::Basicの書き方では、ダイジェストまたは基本認証がそれぞれ存在しない場合、どちらも 401 を返します。

これは通常、Plack ではどのように処理されますか?

4

2 に答える 2

4

実装はありませんが、アプローチはあると思います。これはPlack::Middleware::Conditionalを使用して「インライン」で実行できます。このようになりますが、不足している条件/テストを埋める必要があります。簡単で明白な方法は見当たりませんでしたが、そうかもしれません。渡す必要$envがあるため、必要な順序で HTTP_/session のものを設定/チェックし、次のハンドラーが有効にする必要があるかどうかを知るために状態を維持できる必要があります。

use Plack::Builder;

my $app = sub {
    [ 200,
      [ "Content-Type" => "text/plain" ],
      [ "O HAI, PLAK!" ]
    ];
};

builder {
    enable "Session::Cookie";
    enable_if { my $env = shift;
                # I don't know...
            } "Auth::Digest",
                realm => "Secured", secret => "BlahBlah",
                    authenticator => sub { $_[0] eq $_[1] };
    enable_if { my $env = shift;
                # I don't know...
            } "Auth::Basic",
                authenticator => sub { $_[0] eq $_[1] };
    $app;
};
于 2011-01-17T03:53:06.793 に答える
2

理想的には( RFC 2617の非常に迅速な読み取りに基づいて)認証されていない場合、基本チャレンジとダイジェストチャレンジの両方を含む WWW-Authenticate ヘッダーを返すため、独自のミドルウェアを作成する必要があると思います(最初にユーザーに対して基本チャレンジを使用)基本のみを理解するエージェント)。

于 2011-01-11T04:47:24.407 に答える