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
)
)
このコードを仮想ホストに追加する必要があります
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
DirectoryタグではなくVirtualhostタグで作業します。
Akambiの答えは私にはうまくいきませんでしたが、php Webサイトでこの答えを見つけました:
「CGI/FastCGI ApacheでAuthorizationヘッダーが見つからない場合の回避策:
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
クライアントがAuthorizationヘッダーを送信する場合、PHPは$ _SERVER [PHP_AUTH_ *]変数を自動的に宣言する必要があります。 "
ありがとう、derkontrollfreak + 9hy5l!
検証済みのソリューションは、その時点でAuthorizationヘッダーを取得するのに役立ちました。ただし、着信要求に何もない場合、空のAuthorizationヘッダーが生成されました。これは私がそれを解決した方法です:
RewriteEngine On
RewriteCond %{HTTP:Authorization} .+
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
カスタム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 }
許可ヘッダーは http基本認証 に使用されます。有効な形式でない場合、Apacheによって破棄されます。別の名前を使用してみてください。
他のオプションがなかったときにApache 2.4で機能した別のオプションは、次のように関連する<Directory>
コンテキストで CGIPassAuth
オプションを設定することでした。
CGIPassAuth On
ドキュメントによると、Apache 2.4.13以降で利用可能です。
サーバー側でこのヘッダー「Authorization」を承認する必要があります。
また、nelmioCorsBundle nelmio_cors: defaults: allow_credentials: false allow_Origin: [] allow_headers: [] allow_methods: [] expose_headers: [] max_age: 0 hosts: [] Origin_regex: false forced_allow_Origin_value: ~ paths: '^/api/': allow_Origin: ['*'] allow_headers: ['Authorization']
別の解決策は、PHP
ハンドラーを変更してPHP as Apache Module
の代わりにCGI application
。