Bug(バグ) #3934
未完了:80, :443 以外のポートでアクセスするSNSでOAuth署名の検証に失敗する
0%
説明
Overview (現象)¶
http://sns.example.com:8080/ のように :80, :443 以外のポートに設置された SNS で、opWebAPIPlugin などが提供する API に OAuth を使用してアクセスしようとすると OAuth 署名の検証に失敗してエラーとなる。
その際に、Apache の error_log には下記のようなエラーが記録される:
[Mon Apr 25 09:08:16.854133 2016] [fcgid:warn] [pid 27166:tid 139768981554944] [client 10.0.2.2:60103] mod_fcgid: stderr: Invalid signature
Causes (原因)¶
source:lib/vendor/OAuth/OAuth.php@43190aa1#L190
public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) {
$scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on")
? 'http'
: 'https';
@$http_url or $http_url = $scheme .
'://' . $_SERVER['HTTP_HOST'] .
':' .
$_SERVER['SERVER_PORT'] .
$_SERVER['REQUEST_URI'];
上記のコードは OAuthRequest::from_request()
メソッドの冒頭部分であるが、例えば http://sns.example.com:8080/
のような URL にアクセスがあった場合は上記の $_SERVER['HTTP_HOST']
には sns.example.com:8080
の文字列が入る。
つまり、この場合の $http_url
は http://sns.example.com:8080:8080/
という文字列が生成されてしまう。
この $http_url
は oauth_signature
の検証にも使用される文字列であるため、最終的には署名の検証に失敗し不正なリクエストとして扱われることになる。
Way to fix (修正内容)¶
この不具合は lib/vendor/OAuth/OAuth.php
の問題であるが、 https://code.google.com/archive/p/oauth/issues/170 の通り既に報告がされており修正も済んでいる。
そのため、lib/vendor/OAuth/OAuth.php
を最新の https://oauth.googlecode.com/svn/code/php/OAuth.php に置き換えることで当チケットの不具合は解決する。