47

Symfony 2 でカスタム認証プロバイダーを実装しようとしています。Fiddler を使用してテスト リクエストを送信し、サーバー側のすべてのヘッダーを出力しています。まあ、Authorizationヘッダーがありません。

私は何か間違ったことをしていますか?

GET /RESTfulBackend/web/index.php HTTP/1.1
Authorization: FID 44CF9590006BF252F707:jZNOcbfWmD/
Host: localhost
User-Agent: Fiddler
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3

リスナーはヘッダーを出力して終了します。

class HMACListener implements ListenerInterface
{
    private $securityContext;

    private $authenticationManager;

    public function handle(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        print_r($request->headers->all()); 
        die();
     }
}

応答にAuthorizationヘッダーがありません:

Array
(
    [host] => Array
        (
            [0] => localhost
        )
    [user-agent] => Array
        (
            [0] => Fiddler
        )
    [accept] => Array
        (
            [0] => text/html,application/xhtml+xml,application/xml
        )
    [accept-language] => Array
        (
            [0] => it-it,it;q=0.8,en-us;q=0.5,en;q=0.3
        )
)
4

8 に答える 8

61

このコードをvirtualhostタグに追加する必要があります

Directoryタグに入れると動作しません。

    RewriteEngine On
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
于 2013-06-18T17:31:04.843 に答える
32

Akambiの答えはうまくいきませんでしたが、php Webサイトでこの答えを見つけました:

"CGI/FastCGI Apache で Authorization ヘッダーが見つからない場合の回避策:

SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

クライアントが Authorization ヘッダーを送信すると、PHP は $_SERVER[PHP_AUTH_*] 変数を自動的に宣言する必要があります。"

ありがとうderkontrollfreak+9hy5l!

于 2014-11-18T04:04:58.507 に答える
10

Authorizationカスタムヘッダーを使用してパブリック API を作成するときに、同じ問題が発生しました。HeaderBagリスナーを使用して修正するには:

namespace My\Project\Frontend\EventListener;

use Symfony\Component\HttpFoundation\HeaderBag;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;

/**
 * Listener for the REQUEST event. Patches the HeaderBag because the
 * "Authorization" header is not included in $_SERVER
 */
class AuthenticationHeaderListener
{
    /**
     * Handles REQUEST event
     *
     * @param GetResponseEvent $event the event
     */
    public function onKernelRequest(GetResponseEvent $event)
    {
        $this->fixAuthHeader($event->getRequest()->headers);
    }
    /**
     * PHP does not include HTTP_AUTHORIZATION in the $_SERVER array, so this header is missing.
     * We retrieve it from apache_request_headers()
     *
     * @param HeaderBag $headers
     */
    protected function fixAuthHeader(HeaderBag $headers)
    {
        if (!$headers->has('Authorization') && function_exists('apache_request_headers')) {
            $all = apache_request_headers();
            if (isset($all['Authorization'])) {
                $headers->set('Authorization', $all['Authorization']);
            }
        }
    }
}

kernel.requestそしてそれをサービス定義にバインドします:

services:
  fix_authentication_header_listener:
    class: My\Project\Frontend\EventListener\AuthenticationHeaderListener
    tags:
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 255 }
于 2013-02-01T22:41:17.013 に答える
8

Authorization ヘッダーは、有効な形式でない場合、Apache によって破棄されるhttp 基本認証に使用されます。別の名前を使用してみてください。

于 2012-08-16T17:42:27.970 に答える
6

他のオプションが機能しなかったときに Apache 2.4 で機能した別のオプションは、次のようCGIPassAuthに、関連する<Directory>コンテキストでオプションを設定することでした。

CGIPassAuth On

ドキュメントによると、Apache 2.4.13 以降で利用可能です。

于 2016-07-04T00:14:05.597 に答える