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

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

ただいまの
回答率

90.33%

TwitterAPI Opauthを使用してソーシャルログイン時にemailを取得する

解決済

回答 2

投稿 編集

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

hebo_san

score 14

行いたいこと:
fuelphp,Opauth使ってTwiiterへのソーシャルログイン時にユーザーのemailを取得したい

前提:

  • whitelist? email取得用の権限は取得済み。

ログイン時

  • 元ファイルURL : http://opauth.org
    TwitterStrategy.phpを参考に使用しています。

  • 公式参考URL :
    https://dev.twitter.com/rest/reference/get/account/verify_credentials

  • fulephp : 1.7.3

  • php 5.5.30(cli)

状況:

  • リダイレクトやemail以外の値取得など通常フローは問題なく動作。
  • emailのみ取得ができていない。

原因がわからず煮詰まってしまっているのでご教示いただけると大変ありがたく思います。
よろしくお願い致します。

<?php
/**
 * Twitter strategy for Opauth
 * Based on https://dev.twitter.com/docs/auth/obtaining-access-tokens
 * 
 * More information on Opauth: http://opauth.org
 * 
 * @copyright    Copyright © 2012 U-Zyn Chua (http://uzyn.com)
 * @link         http://opauth.org
 * @package      Opauth.TwitterStrategy
 * @license      MIT License
 */

class TwitterStrategy extends OpauthStrategy {

    /**
     * Compulsory parameters
     */
    public $expects = array('key', 'secret');

    /**
     * Optional parameters
     */
    public $defaults = array(
        'method' => 'POST',         // The HTTP method being used. e.g. POST, GET, HEAD etc 
        'oauth_callback' => '{complete_url_to_strategy}oauth_callback',

        // For Twitter
        'request_token_url' => 'https://api.twitter.com/oauth/request_token',
        'authorize_url' => 'https://api.twitter.com/oauth/authenticate', // or 'https://api.twitter.com/oauth/authorize'
        'access_token_url' => 'https://api.twitter.com/oauth/access_token',
        'verify_credentials_json_url' => 'https://api.twitter.com/1.1/account/verify_credentials.json',
   // 'verify_credentials_skip_status' => true,
        'verify_credentials_include_email' => true, 
        'twitter_profile_url' => 'http://twitter.com/{screen_name}',

        // From tmhOAuth
        'user_token'                    => '',
        'user_secret'                    => '',
        'use_ssl'                        => true,
        'debug'                            => false,
        'force_nonce'                    => false,
        'nonce'                            => false, // used for checking signatures. leave as false for auto
        'force_timestamp'                => false,
        'timestamp'                        => false, // used for checking signatures. leave as false for auto
        'oauth_version'                    => '1.0',
        'curl_connecttimeout'            => 30,
        'curl_timeout'                    => 10,
        'curl_ssl_verifypeer'            => false,
        'curl_followlocation'            => false, // whether to follow redirects or not
        'curl_proxy'                    => false, // really you don't want to use this if you are using streaming
        'curl_proxyuserpwd'                => false, // format username:password for proxy, if required
        'is_streaming'                    => false,
        'streaming_eol'                    => "\r\n",
        'streaming_metrics_interval'    => 60,
        'as_header'                          => true,
    );

    public function __construct($strategy, $env) {
        parent::__construct($strategy, $env);

        $this->strategy['consumer_key'] = $this->strategy['key'];
        $this->strategy['consumer_secret'] = $this->strategy['secret'];

        require dirname(__FILE__).'/Vendor/tmhOAuth/tmhOAuth.php';
        $this->tmhOAuth = new tmhOAuth($this->strategy);
    }

    /**
     * Auth request
     */
    public function request() {
        $params = array(
            'oauth_callback' => $this->strategy['oauth_callback']
        );

        $results =  $this->_request('POST', $this->strategy['request_token_url'], $params);

        if ($results !== false && !empty($results['oauth_token']) && !empty($results['oauth_token_secret'])){
            if (!session_id()) {
                session_start();
            }
            $_SESSION['_opauth_twitter'] = $results;

            $this->_authorize($results['oauth_token']);
        }
    }

    /**
     * Receives oauth_verifier, requests for access_token and redirect to callback
     */
    public function oauth_callback() {
        if (!session_id()) {
            session_start();
        }
        $session = $_SESSION['_opauth_twitter'];
        unset($_SESSION['_opauth_twitter']);

        if (!empty($_REQUEST['oauth_token']) && $_REQUEST['oauth_token'] == $session['oauth_token']) {
            $this->tmhOAuth->config['user_token'] = $session['oauth_token'];
            $this->tmhOAuth->config['user_secret'] = $session['oauth_token_secret'];

            $params = array(
                'oauth_verifier' => $_REQUEST['oauth_verifier']
            );

            $results =  $this->_request('POST', $this->strategy['access_token_url'], $params);

            if ($results !== false && !empty($results['oauth_token']) && !empty($results['oauth_token_secret'])) {
                $credentials = $this->_verify_credentials($results['oauth_token'], $results['oauth_token_secret']);

                if (!empty($credentials['id'])) {

                    $this->auth = array(
                        'uid' => $credentials['id'],
                        'info' => array(
                            'name' => $credentials['name'],
                            'nickname' => $credentials['screen_name'],
                            'urls' => array(
                                'twitter' => str_replace('{screen_name}', $credentials['screen_name'], $this->strategy['twitter_profile_url'])
                            )
                        ),
                        'credentials' => array(
                            'token' => $results['oauth_token'],
                            'secret' => $results['oauth_token_secret']
                        ),
                        'raw' => $credentials
                    );

                    $this->mapProfile($credentials, 'location', 'info.location');
                    $this->mapProfile($credentials, 'description', 'info.description');
                    $this->mapProfile($credentials, 'profile_image_url', 'info.image');
                    $this->mapProfile($credentials, 'url', 'info.urls.website');

                    $this->callback();
                }
            }
        } else {
            $error = array(
                'code' => 'access_denied',
                'message' => 'User denied access.',
                'raw' => $_GET
            );

            $this->errorCallback($error);
        }


    }

    private function _authorize($oauth_token) {
        $params = array(
            'oauth_token' => $oauth_token
        );

        if (!empty($this->strategy['force_login'])) $params['force_login'] = $this->strategy['force_login'];
        if (!empty($this->strategy['screen_name'])) $params['screen_name'] = $this->strategy['screen_name'];

        $this->clientGet($this->strategy['authorize_url'], $params);
    }

    private function _verify_credentials($user_token, $user_token_secret) {
        $this->tmhOAuth->config['user_token'] = $user_token;
        $this->tmhOAuth->config['user_secret'] = $user_token_secret;

  // $params = array( 'skip_status' => $this->strategy['verify_credentials_skip_status'] );
        $params = array( 'include_email' => $this->strategy['verify_credentials_include_email'] );

        $response = $this->_request('GET', $this->strategy['verify_credentials_json_url'], $params);

        return $this->recursiveGetObjectVars($response);
    }



    /**
     * Wrapper of tmhOAuth's request() with Opauth's error handling.
     * 
     * request():
     * Make an HTTP request using this library. This method doesn't return anything.
     * Instead the response should be inspected directly.
     *
     * @param string $method the HTTP method being used. e.g. POST, GET, HEAD etc
     * @param string $url the request URL without query string parameters
     * @param array $params the request parameters as an array of key=value pairs
     * @param string $useauth whether to use authentication when making the request. Default true.
     * @param string $multipart whether this request contains multipart data. Default false
     */    
    private function _request($method, $url, $params = array(), $useauth = true, $multipart = false) {
        $code = $this->tmhOAuth->request($method, $url, $params, $useauth, $multipart);

        if ($code == 200) {
            if (strpos($url, '.json') !== false) {
                $response = json_decode($this->tmhOAuth->response['response']);
            } else {
                $response = $this->tmhOAuth->extract_params($this->tmhOAuth->response['response']);
            }

            return $response;        
        } else {
            $error = array(
                'code' => $code,
                'raw' => $this->tmhOAuth->response['response']
            );

            $this->errorCallback($error);

            return false;
        }
    }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

ホワイトリスト登録が確認できたので

'verify_credentials_include_email'=>true
// URL 変換後 include_email=1 となる

ではなく

'verify_credentials_include_email'=>'true'
// URL 変換後 include_email=true となる

で発行してみてください

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/23 12:09

    ホワイトリスト申請自体は最近にしたものですが承認されてから管理画面に新たな権限と連携時にemail取得の文言が出るようにはなりました

    キャンセル

  • 2016/08/23 12:39

    これでできなかったら申請したIPとホワイトリストに登録したIPが違うと思われます

    キャンセル

  • 2016/08/23 19:12

    ありがとうございます!無事解決できました。

    キャンセル

0

メールアドレスを取得するには、
アクセストークンを取得したあとにさらにもう一度 データを取得し直す必要がある。

TwitterStrategyを触る必要も、
'verify_credentials_include_email'=>true
とする必要もない。

1 まずはアクセストークンを取得
(ここではどのようにしてもメールアドレスは取得できない)

2 1 で取得したアクセストークンで接続し直す

$this->connection = new TwitterOAuth(
            $config['APIkey'],
            $config['APIsecret'],
            $access_token,
            $access_token_secret
        );

        $json = $this->connection->get("account/verify_credentials", ['include_entities'=> 'false', 'include_email'=> 'true']);

これでメールアドレスが取得できる。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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