こういうの作れる?と聞かれたのがTwitterアプリ連携を使ったログインでした。

SNSアカウントを使ったログインは、今や一般的で調べれば多くの情報があるだろうと思って、軽く「できるよー」なんて答えたのですがこれが失敗でした。

僕の検索方法が悪いのか、Twitterアカウントを使ったソーシャルログインの情報は少なかったです。

基本的にはTwitterOAuthを利用するのですが、たしかバージョンが1.0⇒1.1へアップしているので、古くて使えない情報も多くて困りました。

なので、2017年10月の段階で動く、Twitterアプリを連携させる情報を載せておきます。

基本的な流れとファイル構成

作成するPHPファイル

login.php
callback.php

基本的な流れ

  1. login.phpにアクセス
  2. callback.phpで使うセッションを取得。
    認証画面のURLを取得。
    認証画面へリダイレクト。

  3. アプリを連携する認証画面
  4. 連携アプリを認証するかキャンセルするかの選択。
    アプリケーションで出来る事の内容表示。
    設定時のみ「プライバシポリシー」「利用規約」リンクの表示。
    設定されたcallbackのURLへリダイレクト。

  5. callback.php
  6. 認証画面から戻ってくるページ。
    認証画面で(認証・キャンセル)どちらを選択してもcallback.phpに戻ってきます。
    (TwitterAppでcallbackのURLを設定、もしくはlogin.phpでcallbackのURLを設定します。)
    認証された時はユーザーの情報を取得してDBに情報保存など。
    完了ページへのリダイレクト

PHPプログラム

参考ページ:【PHP】新TwitterOAuthでログイン機能を実装する

API Keyの取得は

【Twitter連携アプリ】TwitterAPIを使ったWebアプリケーション作成に必要なこと

を参考に取得してください。

login.php

//API Keyの設定
define('C_TWITTER_KEY_CK','********************');  //Consumer Key (API Key)
define('C_TWITTER_KEY_CS','********************');  //Consumer Secret (API Secret)

//「twitteroauth」の読み込み
//作成環境によってPATHを変更してください。
require_once 'autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;

//TwitterOAuthオブジェクト生成
$connection = new TwitterOAuth(constant('C_TWITTER_KEY_CK'),constant('C_TWITTER_KEY_CS'));

//リクエストトークンの取得
//証後のコールバックURLを指定する場合
$request_token = $connection->oauth('oauth/request_token', array('oauth_callback' => 'http://www.example.com/callback.php'));

//TwitterAPPで設定したコールバックURLを使用する場合
//$request_token = $connection->oauth('oauth/request_token');

//リクエストトークンの取得(callback.phpで使用するのでセッションに保存)
$_SESSION['request_oauth_token'] = $request_token['oauth_token'];
$_SESSION['request_oauth_token_secret'] = $request_token['oauth_token_secret'];

//Twitter連携アプリ認証ページURLの取得
$url = $connection->url('oauth/authenticate', array('oauth_token' => $request_token['oauth_token']));

//Twitter連携アプリ認証ページURLへリダイレクト
header('Location: '.$url) ;

callback.php

//API Keyの設定
define('C_TWITTER_KEY_CK','********************');  //Consumer Key (API Key)
define('C_TWITTER_KEY_CS','********************');  //Consumer Secret (API Secret)

//「twitteroauth」の読み込み
//作成環境によってPATHを変更してください。
require_once 'autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;

//login.phpでセットしたセッション
$request_token = [];  //array() の短縮記法。
$request_token['oauth_token'] = $_SESSION['oauth_token'];
$request_token['oauth_token_secret'] = $_SESSION['oauth_token_secret'];

//Twitterから返されたOAuthトークンと、あらかじめlogin.phpで入れておいたセッション上のものと一致するかをチェック
if (empty($_REQUEST['oauth_token']) || $request_token['oauth_token'] !== $_REQUEST['oauth_token']) {
    die( 'Error!' );
}

//OAuthトークンを用いてTwitterOAuthオブジェクト生成
$connection = new TwitterOAuth(constant('C_TWITTER_KEY_CK'),constant('C_TWITTER_KEY_CS'),$request_token['oauth_token'],$request_token['oauth_token_secret']);

//認証ユーザーのaccess_token(配列になっています)を取得
$access_token = $connection->oauth("oauth/access_token", array("oauth_verifier" => $_REQUEST['oauth_verifier']));

//user_id、screen_name、oauth_token、oauth_token_secretが取得できます。
//自サイトのユーザー情報として保存、パーミッションによってはトークンを使用してアカウント操作(他人のアカウントでつぶやくなど)ができます。
//var_dump($access_token);

//認証完了ページやTOPページなどへリダイレクト
//header( 'location: http://www.example.com/' );

動作を確認できなかった事

参考サイトのコメント欄に以下のコメントがありました。

「Allow this application to be used to Sign in with Twitter」にチェックを入れている場合は、以下のようにコードの修正が必要です。

login.php の下の方に、以下のようなコードがあると思います。

//Twitter.com 上の認証画面のURLを取得
$url = $connection->url('oauth/authorize', array('oauth_token' => $request_token['oauth_token']));

この authorize を authenticate に変更してください。

変更後:

//Twitter.com 上の認証画面のURLを取得
$url = $connection->url('oauth/authenticate', array('oauth_token' => $request_token['oauth_token']));

こうすると、チェックされている場合、承認確認のページをスキップすることができます。

チェックの有無にかかわらず、authenticate に変更しておけば、

  • チェックつき – 2回め以降は承認確認ページスキップ
  • チェックなし – 常に承認確認ページを表示

とできるようなので、記事中も、authorize から authenticate に修正しておきたいと思います。

「Allow this application to be used to Sign in with Twitter」にチェックを入れたのですが、認証確認ページがスキップできませんでした。

この問題の解決には至りませんでした。

認証確認ページがスキップ出来なくても僕は構わなかったので、この問題が解決できた時は報告します。

まとめ

このままコピペでは動かないので、開発環境によって修正箇所は出てきます。

TwitterAPPへの登録も必要なので、サンプルを作成するまでは時間がかかると思いますが、一度理解すればとても簡単です。

TwitterAPPのパーミッション設定によっては、他人のアカウントでつぶやいたり、DMへアクセス出来たりします。

しかし、そのようなパーミッションを使えば連携認証する人はいなくなるので、Twitterアカウントを使ったソーシャルログインを用意する場合は、パーミッションを「Read only」に設定するのが無難だと思いますよ。

参考サイトのコメント欄には勉強になるコメントも多いので確認する事をオススメします。

それでは良きサイト作成を!