質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.51%

ブラウザからアクセスしたときにTwitterOAuthが動作しません

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,368

HALBY

score 14

前提・実現したいこと

Twitter向けの簡易的な自動投稿サービスを作っていて、現在はライブラリ等使っていないのですが機能が増えてきたので簡略化のためにTwitterOAuthを導入することにしました。
以下のようなコードを書いたのですが、ターミナルから実行した場合は正常に動作するのにブラウザから開いた場合TwitterOAuthのインスタンス化のあたりで止まってしまいそこから先の処理が行われません。なぜでしょうか?

該当のソースコード

session_start();
require_once "twitteroauth/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
define( 'C_KEY', 'コンシューマーキー' );
define( 'C_SEC', 'コンシューマーシークレット' );

class OAuth {
    function tknrq() {
        $cnct = new TwitterOAuth(C_KEY, C_SEC);
        $rto = $cnct->oauth('oauth/request_token', array('oauth_callback' => 'コールバックURL'));
        $_SESSION['ot'] = $rto['oauth_token'];
        $_SESSION['otc'] = $rto['oauth_token_secret'];
        $url = $cnct->url('oauth/authorize', array('oauth_token' => $rto['oauth_token'])); 
        return $url;
    }
    function tknrt() {
        $rto['ot'] = $_SESSION['ot'];
        $rto['otc'] = $_SESSION['otc'];
        $cnct = new TwitterOAuth(C_KEY, C_SEC, $rto['ot'], $rto['otc']);
        $ato = $cnct->oauth("oauth/access_token", array("oauth_verifier" => $_REQUEST['oauth_verifier']));
        return $ato;
    }
}

$oauth = new OAuth;

if( isset( $_GET['oauth_token'] ) && !empty( $_GET['oauth_token'] ) && isset( $_GET['oauth_verifier'] ) && !empty( $_GET['oauth_verifier'] ) ) {
    $ato = $oauth->tknrt();
    print_r($ato);
} else {
    $url = $oauth->tknrq();
    print_r($url);
    header('Location: ' . $url);
}

補足など

ソースは関連する部分だけを抜き出しています
ターミナルで実行した場合は$urlが正常に出力されます
ちなみにtknrq()内の1,2,5行目をコメントアウトして適当な文字列を返すようにした場合は表示されます

実行環境

PHP5.6.4
さくらVPS CentOS 6.8

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

ちなみにtknrq()内の1,2,5行目をコメントアウトして適当な文字列を返すようにした場合は表示されます

$rtoが何になっているかvar_dump($rto);で確認しましたか?デバッグの基本ですよ.また,そのままLocationヘッダで遷移してしまうとマズいので,直後にexitを入れてください.


【蛇足】

ライブラリ側の実装も含め,認証に関する例外処理が甘いような気がします.一度 mpyw/TwistOAuth で試してもらえませんか?このライブラリは少しでもおかしいことがあると TwistException をスローするのですぐに間違いに気付けます.

サンプルコードを書いておきます.

<?php

require 'TwistOAuth.phar'; // Composerで入れた場合は vendor/autoload.php

cosnt C_KEY = 'コンシューマーキー';
const C_SEC = 'コンシューマーシークレット';
const C_CALLBACK = 'コールバックURL';

session_start(); // session_startは必ずrequireより後ろに書く

try {

    // セッションが空のときはリクエストトークンを取得したクレデンシャルをセッションに格納して
    // 認証用ページにリダイレクトさせ,以降の処理はカットする
    if (!isset($_SESSION['to'])) {
        $_SESSION['to'] = new TwistOAuth(C_KEY, C_SEC);
        $_SESSION['to'] = $_SESSION['to']->renewWithRequestToken(C_CALLBACK);
        header("Location: {$_SESSION['to']->getAuthorizeUrl()}");
        exit;
    }

    // セッションがアクセストークン未取得状態のときはoauth_verifierをパラメータとしてそれを取りに行く
    // 成功したらログイン済みフラグをセットする
    if (!isset($_SESSION['logined'])) {
        $_SESSION['to'] = $_SESSION['to']->renewWithAccessToken(filter_input(INPUT_GET, 'oauth_verifier'));
        $_SESSION['logined'] = true;
    }

    // クレデンシャルの中身を表示
    var_dump($_SESSION['to']);

} catch (TwistException $e) {

    // 認証ステップでなにか異常があったらセッションを空にしてエラーメッセージを表示
    // (ページを更新するとリクエストトークン取得から再試行になる)
    $_SESSION = [];
    header('Content-Type: text/plain; charset=UTF-8', true, $e->getCode() ?: 500);
    exit($e->getMessage());

}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/31 07:46

    こちらのコードに置き換えて試してみたところ無事動作しました!
    夜中にブラウザからPHPのバージョンを確認しにいったところアップデート前のPHP5.3が表示されていたのでそれが直接の原因だと思います(なぜか朝にはPHP5.6になっていましたが…)
    こちらのコードにしてから動作状況がよくわかるようになりましたので大変助かっています。ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる