PHP : CodeIgniter + Twitter API Library での oauth 投稿の具体的なポイント

  PHP フレームワーク : CodeIgniter



CodeIgniter とは、アメリカの EllisLab によって開発されたPHPのフレームワークです。
フレームワークは、PHP の学習には適しませんが、システム開発には無くてはならない
もので、特に特殊な処理に関してはそれぞれのフレームワークで容易に実現可能になっ
ているのが通常です。ただ、フレームワークであるが故に自由の利かない場面もあります。

また、フレームワークは万能では無く、アプリケーション開発にはそのフレームワークの
能力を十分に発揮できる「骨組み」と中身を良く知る技術者が必要になります


日本CodeIgniterユーザ会 のがどのようなものかは知りませんが、一般的にこのような会
「日本語」に関する情報や手助けを行う事を主旨としていますので、開発そのものは自分
の環境に適したものを自ら構築する必要があります。

その導入として、ドキュメントが日本語化された日本語言語パック ci-ja-all-in-one
(1.7.2用)
は、技術者にとって良い手助けになるものと思います。




  Twitter API CodeIgniter Library



Twitter API に限らず、セキュアな認証処理は面倒なもので、自分であまり作りたいものでは無く、
できれば「動作するコード」を手に入れるのが早道には違いないのですが、思った目的をそのコード
で達成できない場合には、他人が作ったコードを読まなくてはいけないというデメリットもあります。

そういう意味で、Twitter API CodeIgniter Library — Elliot Haughin は、実用には
少し問題があるようですが、Twitter に対する処理の面倒な部分である認証そのものには何も問題
は無いので、その部分を利用するには比較的良いコードであると思います。

以下は、サンプルコードのコメント部分を省いた、最小限の投稿サンプルです。

  
<?php

class Home extends Controller {

	function Home()
	{
		parent::Controller();	
	}
	
	public function index()
	{
		$consumer_key = '';
		$consumer_key_secret = '';

		$this->load->library('session');
		
		$tokens['access_token'] = NULL;
		$tokens['access_token_secret'] = NULL;

		$oauth_tokens = $this->session->userdata('twitter_oauth_tokens');

		if ( $oauth_tokens !== FALSE ) $tokens = $oauth_tokens;

		$this->load->library('twitter');

		$auth = $this->twitter->oauth(
			$consumer_key, 
			$consumer_key_secret, 
			$tokens['access_token'], 
			$tokens['access_token_secret']
		);

		if ( isset($auth['access_token']) && isset($auth['access_token_secret']) )
		{
			$this->session->set_userdata('twitter_oauth_tokens', $auth);

			if ( isset($_GET['oauth_token']) )
			{
				$uri = $_SERVER['REQUEST_URI'];
				$parts = explode('?', $uri);

				header('Location: '.$parts[0]);
				return;
			}
		}

		$this->twitter->call(
			'statuses/update', 
			array('status' => '本文')
		);

	}
}
  

CodeIgniter としては、ごく一般的なコードで、インストールURL/index.php/home でアクセスされます。
Twitter で登録して取得したトークンを以下のコード部分に埋め込むだけで動作します。

  
$consumer_key = '';
$consumer_key_secret = '';
  

そして、コードの内容からも推測できますが、以下のトークンが認証後に得られるもので、
これを保存しておく事によってユーザにログインを求める事無く処理を継続する事ができます。

  
$tokens['access_token'] = NULL;
$tokens['access_token_secret'] = NULL;
  

初回、このトークンは NULL であり、ログイン画面にリダイレクトされ、ログイン後に Twitter 側ではアプリ
が登録されてかつ、ユーザ側の URL が再度呼び出されます。( ここでは同じこの場所を想定しています )
その結果クッキーにトークンが登録され、その情報を使って以降は API をログイン無しで呼び出す事ができ
るようになります。( セッションへの書き込みがされている最後の if 構文の中で最初の登録が行われます )

よって、クッキーが削除されると、そのブラウザでは新たなユーザでのログインが求められる事になるのです
が、このコードでは一つ問題があって、Twitter 側でアプリケーションが削除されても再度ログインが必要
なのですが、トークンが削除されていないので継続して処理が行われ、エラーになっいるのですが、それを
チェックする機構が twitter->oauth にありません。ですから、自分で account/verify_credentials
を実行して結果からエラーであった場合はトークンを空にして呼び出す必要があります。

また、もう一つ問題があって、Twitter.php 内の定数であるログイン用の URL が https でなく http に
なっているので、折角のセキュアな認証の意味が無くなっていますので、以下のように変更する必要があり
ます

  
protected $authorizeUrl = 'https://twitter.com/oauth/authorize';
  



  ファイルにトークンを保存した永続的な接続

以下は簡単な画面を追加し、認証の有効チェックを行ったサンプルです。
トークンがサーバーのファイルに保存されているので、Twitter でアプリ
ケーションを削除しない限り、ユーザがログイン画面を見る事はありません。

  
<?php

class Home extends Controller {

	function Home()
	{
		parent::Controller();	
	}
	
	public function index()
	{
		// 画面の表示
		$this->load->view('view_twitter.php');

		if ( $this->input->post('send', TRUE) == '' ) {
			return;
		}

		$consumer_key = '';
		$consumer_key_secret = '';

		// デフォルトのトークン
		$tokens['access_token'] = NULL;
		$tokens['access_token_secret'] = NULL;

		// 保存されたトークンがある場合はそれを使う
		$ret = file_get_contents( "./token.txt" );
		if ( $ret != "" && $ret != "\t" ) {
			$oauth_tokens = explode("\t",$ret);
			$tokens['access_token'] = $oauth_tokens[0];
			$tokens['access_token_secret'] = $oauth_tokens[1];
		}

		// ライブラリロード
		$this->load->library('twitter');

		// 認証( トークンが空の場合はブラウザで認証 )
		$auth = $this->twitter->oauth(
			$consumer_key,
			$consumer_key_secret,
			$tokens['access_token'],
			$tokens['access_token_secret']
		);

		// 認証が有効かチェック
		$check = $this->twitter->call('account/verify_credentials');
		if ( property_exists( $check, "error" ) ) {
			// 認証できていない場合は、新規認証
			$tokens['access_token'] = NULL;
			$tokens['access_token_secret'] = NULL;
			$auth = $this->twitter->oauth(
				$consumer_key,
				$consumer_key_secret,
				$tokens['access_token'],
				$tokens['access_token_secret']
			);
		}

		// 初回認証の処理
		if ( isset($auth['access_token']) && isset($auth['access_token_secret']) )
		{

			// トークンを保存
			file_put_contents(
				 "./token.txt", 
				$auth['access_token'] . "\t" . $auth['access_token_secret'] 
			);

			// 元々あった処理
			if ( isset($_GET['oauth_token']) )
			{
				$uri = $_SERVER['REQUEST_URI'];
				$parts = explode('?', $uri);
				header('Location: '.$parts[0]);
				return;
			}
		}

		$this->twitter->call(
			'statuses/update',
			array('status' => $this->input->post('text', TRUE) )
		);

	}
}
  













   SQLの窓    create:2010/04/14  update:2015/09/23   管理者用(要ログイン)





フリーフォントツール

SQLの窓ツール

SQLの窓フリーソフト

写真素材

一般ツールリンク

SQLの窓

フリーソフト

JSライブラリ