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

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

ただいまの
回答率

90.49%

  • PHP

    20770questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • API

    1554questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Twitter

    674questions

    Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

php TwitterOAuth シングルページで実装したい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 498

kuzurotto

score 388

TwitterOAuthを実装するにあたり色々記事を見かけて実装しているのですが、
3ファイルでのやり方が多いのですが、1ファイルで完結させることはできないでしょうか?

login.php
collback.php
result.php

のように
login.phpでFacebookでアカウント新規作成のようなボタンが押されたらライブラリのインスタンス生成して、Twitterの承認画面へ遷移。
で、コールバックはcollback.phpでユーザー情報を取得してresult.phpへ遷移して結果表示みたいな流れは理解できているのですが、

これを1ファイルで完結させたいと思いできるところまでやってみたのが下記です。

login.php(これはアクセスした時点で承認画面へ飛びます)

<?php

session_start();

define( 'CONSUMER_KEY', 'Dqncrr4Oexxxxxxxxxx' );
define( 'CONSUMER_SECRET', '5gJ74RGxxxxxxxxxxxxxxxxxxxxxxxxx' );
define( 'OAUTH_CALLBACK', 'http://dev.xxxxx.com/callback.php' );

require_once(__DIR__ . '/lib/Loader.php');


//TwitterOAuth をインスタンス化
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);

//コールバックURLをここでセット
$request_token = $connection->oauth('oauth/request_token', array('oauth_callback' => OAUTH_CALLBACK));

//callback.phpで使うのでセッションに入れる
$_SESSION['oauth_token'] = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];

//Twitter.com 上の認証画面のURLを取得( この行についてはコメント欄も参照 )
$url = $connection->url('oauth/authenticate', array('oauth_token' => $request_token['oauth_token']));

//Twitter.com の認証画面へリダイレクト
header( 'location: '. $url );
?>

collback.phpとresult.phpを凝縮。

<?php

session_start();

define( 'CONSUMER_KEY', 'Dqncrr4Oexxxxxxxxxx' );
define( 'CONSUMER_SECRET', '5gJ74RGxxxxxxxxxxxxxxxxxxxxxxxxx' );
define( 'OAUTH_CALLBACK', 'http://dev.xxxxx.com/callback.php' );

require_once(__DIR__ . '/lib/Loader.php');

//OAuth トークンも用いて TwitterOAuth をインスタンス化
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

//アプリでは、access_token(配列になっています)をうまく使って、Twitter上のアカウントを操作していきます
$access_token =  $connection->oauth("oauth/access_token", array("oauth_verifier" => $_GET['oauth_verifier']));

//OAuthトークンとシークレットも使って TwitterOAuth をインスタンス化
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);

//ユーザー情報をGET
$user = $connection->get("account/verify_credentials", ['include_entities'=> 'false', 'include_email'=> 'true']);

//GETしたユーザー情報をvar_dump
echo "<pre>";
var_dump( $user );
echo "</pre>";

?>

話は少し変わりますが
Login with Facebookではとりあえずできました。
なのでTwitterも実装しようと思ったのですが、少しつまづいてます。

下記は作りかけですがみて頂ければわかると思いますが、
Facebookは”ログインできてたら”という判定で処理しているので
それと同じようにTwitterもやろうと思ったのですが、どうすれば良いのかわかりません。

<?php

//autoloadによる全ファイル自動読込。
require_once(__DIR__ . '/lib/Loader.php');
require_once(__DIR__ . '/lib/config/set_config.php');

if(!empty($_POST['submit'])){

    $obj = new CreateAccount($cfg_set);

    //入力値取得
    $mail            = filter_input(INPUT_POST, 'mail');
    $password        = filter_input(INPUT_POST, 'password');
    $password_confir = filter_input(INPUT_POST, 'password_confir');

    //全項目入力しているか確認
    $checkTheInput = $obj->checkTheInput($mail, $password, $password_confir);

    if($checkTheInput == true) {
        //入力したアドレスがDBに存在しないか確認
        $existenceCheckOfMail = $obj->existenceCheckOfMail($mail);

        if($existenceCheckOfMail == true) {
            //入力したパスワードが一致しているか確認
            $passwordMatch = $obj->passwordMatch($password, $password_confir);
        }
    }

    //仮登録処理
    if(isset($passwordMatch)) {
        if($passwordMatch == true) {

            //account_manage_dumpテーブルへ仮登録
            $tmpRegistration = $obj->tmpRegistration($mail, $password);

            //仮登録のtokenをURLに付与してメール発行。
            mb_language("Japanese");
            mb_internal_encoding("UTF-8");

            $to      = $mail;
            $subject = "【GAMES】仮登録完了のお知らせ";

            $message  = "GAMESへご登録頂きましてありがとうございます。"."\r\n";
            $message .= "下記URLにアクセス後、本登録完了となります。"."\r\n";
            $message .= "http://localhost/dev/personal/web/game_package/create_account_finish.php?token=".$tmpRegistration. "\r\n";
            $message .= "※URL有効期限 : ".$obj->now('+ 1 day'). "\r\n";
            $message .= "登録した覚えがない場合はこのメールを破棄してください。"."\r\n";

            $headers = 'From: info@test.co.jp' . "\r\n";

            mb_send_mail($to, $subject, $message, $headers);

        }
    }

    //デバッグ
    $obj->var_dumpre($obj->msg);

} else if(!empty($_POST['submit_fb'])) {

    var_dump($_POST['submit_fb']."が押されました。");

    $config = array(
        'appId'  => '1199599606787650',
        'secret' => 'fdfb8ecc512196df9ea1b83ba8d65a38'
    );
    $facebook = new Facebook($config);

    //ログイン済みの場合はユーザー情報を取得
    if ($facebook->getUser()) {
        try {
            /*
            汎用性のあるもの
            fields=locale,id,email,last_name,first_name,middle_name,name,gender
            */
            $user = $facebook->api(
                '/me?fields=email,last_name,first_name'
                ,'GET');
                //birthday,languages,
        } catch(FacebookApiException $e) {
            //取得に失敗したら例外をキャッチしてエラーログに出力
            error_log($e->getType());
            error_log($e->getMessage());
        }
    }

    if (isset($user)) {
        //ログイン済みでユーザー情報が取れていれば表示
        echo '<pre>';
        var_dump($user);
        echo '</pre>';
    } else {
        //未ログインならログイン URL へ遷移。
        header( "Location: " .$facebook->getLoginUrl() );
        exit;
    }

} else if(!empty($_POST['submit_tw'])) {

    var_dump($_POST['submit_tw']."が押されました。");

    define( 'CONSUMER_KEY', 'Dqncrr4Oexxxxxxxxxx' );
        define( 'CONSUMER_SECRET', '5gJ74RGxxxxxxxxxxxxxxxxxxxxxxxxx' );
        define( 'OAUTH_CALLBACK', 'http://dev.xxxxx.com/callback.php' );

    //TwitterOAuth をインスタンス化
    $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
    //コールバックURLをここでセット
    $request_token = $connection->oauth('oauth/request_token', array('oauth_callback' => OAUTH_CALLBACK));

    var_dump($_GET['oauth_verifier']);


/*
    $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $request_token['oauth_token'], $request_token['oauth_token_secret']);


    if() {

        //ユーザー情報をGET
        $user = $connection->get("account/verify_credentials", ['include_entities'=> 'false', 'include_email'=> 'true']);

    }
    */




    if (isset($user)) {
        //ログイン済みでユーザー情報が取れていれば表示
        echo '<pre>';
        var_dump($user);
        echo '</pre>';
    } else {
        //未ログインならログイン URL へ遷移。
        $url = $connection->url('oauth/authenticate', array('oauth_token' => $request_token['oauth_token']));
        header( 'location: '. $url );
        exit;
    }




}

var_dump($_POST);



?>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-language" content="ja">
    <meta charset="UTF-8">
    <meta name="robots" content="index,follow">
    <meta name="description" content="">
    <meta name="keywords" content="">
    <meta name="author" content="">
    <title>アカウント作成</title>
    <link rel="stylesheet" href="" />
    <script type="text/javascript" src=""></script>
</head>
<header class="">

</header>
<body>
    <header class="">

    </header>
    <article>
        <form action="" method="post" accept-charset="utf-8">
            <table border="">
                <caption>アカウント作成</caption>
                <tbody>
                    <tr>
                        <th>email</th>
                        <td><input type="email" name="mail" maxlength="50" value= <?= filter_input(INPUT_POST, 'mail'); ?> ></td>
                    </tr>
                    <tr>
                        <th>password</th>
                        <td><input type="password" name="password" minlength="6" maxlength="50" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,}" title="半角数字&#13;&#10;小文字の半角アルファベット&#13;&#10;大文字の半角アルファベット&#13;&#10;これらが組み合わさった6文字以上。"></td>
                    </tr>
                    <tr>
                        <th>password(再入力)</th>
                        <td><input type="password" name="password_confir" minlength="6" maxlength="50" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,}" title="半角数字&#13;&#10;小文字の半角アルファベット&#13;&#10;大文字の半角アルファベット&#13;&#10;これらが組み合わさった6文字以上。"></td>
                    </tr>
                </tbody>
            </table>
            <input type="submit" name="submit" value="登録">
            <input type="submit" name="submit_fb" value="Facebookで作成">
            <input type="submit" name="submit_tw" value="Twitterで作成">
        </form>
    </article>
</body>
<footer>
    <nav>
    </nav>
</footer>
</html>

SESSION使って回って取得するしかないですかね?

追記
http://qiita.com/sofpyon/items/982fe3a9ccebd8702867
http://noumenon-th.net/programming/2016/03/08/twitteroauth/

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2017/01/04 13:46

    なんらかの記事を参考にされたのであれば、その記事URLも記載いただけませんか?

    キャンセル

  • kuzurotto

    2017/01/04 13:50

    追記しました

    キャンセル

回答 1

checkベストアンサー

0

URLにパラメータを付けて切り分けるとか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/04 21:15

    具体的にどうすればいいのでしょうか???

    キャンセル

  • 2017/01/04 21:29

    TwitterOAuth.php?p=login
    TwitterOAuth.php?p=collback
    TwitterOAuth.php?p=result
    こういうのパラメータって言いませんでしたっけ。
    (で、$_GET['p']で分岐する)

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • PHP

    20770questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • API

    1554questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Twitter

    674questions

    Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。