Tech Racho エンジニアの「?」を「!」に。
  • 開発

CakePHPのOAuthライブラリが動かない場合の対応方法

CakePHPでOAuthを使うのに、このライブラリが有名だと思います。

http://code.42dh.com/oauth/

MITライセンスなのが良いですよね。

ところが、これを使ったCakePHPのシステムで、debug=2の時は動くのに、debug=0にすると動かないという謎の問題に出くわしました。

止まる場所は、認証ページへのリダイレクトに使う、

$consumer->getRequestToken('http://twitter.com/oauth/request_token', $callback);

のあたりです。

ソースを追ってみたところ、OAuth.phpの以下の場所で止まっていました。

public function get_normalized_http_url() {
  $parts = parse_url($this->http_url);

  $port = @$parts['port']; // ←ここ!!
  $scheme = $parts['scheme'];
  $host = $parts['host'];
  $path = @$parts['path'];

  $port or $port = ($scheme == 'https') ? '443' : '80';

  if (($scheme == 'https' && $port != '443')
      || ($scheme == 'http' && $port != '80')) {
    $host = "$host:$port";
  }
  return "$scheme://$host$path";
}

いや、確かに、portというキーは無かったんですけど、
そのための@演算子だし、そもそもこんなのでFatal Errorになるはずもなく。

要するに、PHPエンジンの方のバグなのか、謎ですね・・・

解決策は以下。

public function get_normalized_http_url() {
  $parts = parse_url($this->http_url);

  //== add this ==
  if (!array_key_exists('port', $parts)) {
      $parts['port'] = (isset($parts['scheme']) && $parts['scheme'] == 'https') ? '443' : '80';
  }
  //== add this ==

  $port = @$parts['port'];
  $scheme = $parts['scheme'];
  $host = $parts['host'];
  $path = @$parts['path'];

  $port or $port = ($scheme == 'https') ? '443' : '80';

  if (($scheme == 'https' && $port != '443')
      || ($scheme == 'http' && $port != '80')) {
    $host = "$host:$port";
  }
  return "$scheme://$host$path";
}

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。