PECLのOAuthProviderとReverseProxyのメモ

このエントリーをはてなブックマークに追加

phpでPECLのOAuthライブラリを利用していた場合に、nginxでAPIサーバへReverseProxyで素直に転送するとSignatureが不正だと怒られちゃう時の対応方法をメモしとく。
一応ドキュメントはあるんだけど、説明がほとんどないのでprovider.cを見た方が早い。構成はフロントのnginxでHTTPSで受けて、バックエンドをコールするときはHTTPで呼び出す感じ。当然ながら署名のチェックはバックエンドで行われるのでフロントとバックエンドではhostやprotocolが異なり弾かれるので下記の対策が必要。

▽ nginxでX-Forwarded-*ヘッダーを追加しておく
下記みたいな感じで、追加しておく

server {
       listen 443;
       server_name サーバー名;
       省略
       proxy_set_header X-Forwarded-Proto https;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-Host $host;
       proxy_set_header X-Forwarded-Server $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

▽ oauthチェックの処理を修正
下記のようにヘッダーチェックして転送されてきてるならチェック対象urlを自分で組み立てる。

$xForwardedProto=$_SERVER[‘HTTP_X_FORWARDED_PROTO’];
if($xForwardedProto){
       $url=$xForwardedProto.’://’.$_SERVER[‘HTTP_X_FORWARDED_HOST’]
              .$_SERVER[‘REQUEST_URI’];
       $this->provider->checkOAuthRequest($url);
}else{
       $this->provider->checkOAuthRequest();
}

この辺、拡張モジュール側でどのように処理しているかはPECLのoauthのprovider.c#oauth_provider_get_current_uriを見ると良い。1.0から1.2.2では結構判定処理が追加されてるけどHTTP_X_FORWARDED_HOSTは見てくれてない。