(技術的な意味で)

もうちょっと気分とかでなんとかしたかったんです(技術的な意味で)

TwitterのOAuth認証 PHP編

色々なサイトにOAuth認証の方法が載っているが、実用に供する所でいくつか躓いた点があったのでまとめておく。

流れ:
1,Twitterのサイト上で、作成するサービスの利用を登録する。
2,登録が終わったら、今回作成するサービス固有の「consumer_key」「consumer_secret」を取得する。
3,いよいよロジックを組む。

ロジックの流れは下記:
3-1,
 上記の「consumer_key」「consumer_secret」を用いて「oauth_token」「oauth_token_secret」を生成する
3-2,
 上記「oauth_token」「oauth_token_secret」を用いて、Twitterのサイトで認証を行う。認証後に戻ってくるcallbackのURLを指定すること
3-3,
 callbackで指定したURLで、「consumer_key」「consumer_secret」「oauth_token」「oauth_token_secret」を用いて"認証済みアクセストークン"を作成。以降これを用いることでTwitterへの投稿などが出来る。
3-4,
 "認証済みアクセストークン"を保存しておく。今回はシリアライズしてデータベースに保存してみた。

ソースコードはこんな感じ。登録と、CallBackURLと、2つ示す。

登録
// twitter用ライブラリファイルの読み込み
include_once "../lib/twitteroauth.php";

// twitter関連の設定
$consumer_key = "r------------------------------g";
$consumer_secret = "C---------------------------------------------------------------o";

// twitter認証画面へ
$to = new TwitterOAuth($consumer_key, $consumer_secret);
$r_tokenset = $to->getRequestToken("http://localhost/------------/twitter_callback.php");
$_SESSION["rt"] = $r_tokenset["oauth_token"];
$_SESSION["rts"] = $r_tokenset["oauth_token_secret"];
$url = $to->getAuthorizeURL($_SESSION["rt"]);
header("Location: " . $url);

CallBackURL
// twitter用ライブラリファイルの読み込み
require_once("../lib/twitteroauth.php");

// twitter関連の設定
$consumer_key = "r--------------------g";
$consumer_secret = "C-------------------------------------------o";

// アクセストークンの取得
$to = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION["rt"], $_SESSION["rts"]);
$_SESSION["rts"];
$a_tokenset = $to->getAccessToken();

// 取得したアクセストークンをDBに登録
$serialized_tokenset = serialize($a_tokenset);

注意点は下記:

★ライブラリはtwitteroauth.phpを利用
何種類かライブラリがあったが、twitteroauthを使うことにした。日本語での解説ブログが多い点も助かった。

★認証作業を次回以降不要にするためにアクセストークンをシリアライズしてDBに保存
色々なブログには単に「データベースに保存」と書いてある程度だった。どうしようか迷ったがとりあえずシリアライズして突っ込んでみた。最利用するときはアンシリアライズして利用。イメージとしては下記のようなコード。

2度目以降利用時
// アクセストークンの取得
	$sql = "SELECT twitter_access_token FROM hoge_table WHERE id = 123" ;
	$ret = mysql_query($sql);
	$row = mysql_fetch_assoc($ret);
	$a_tokenset = unserialize($row["twitter_access_token"]);
	$to = new TwitterOAuth($consumer_key, $consumer_secret, $a_tokenset["oauth_token"], $a_tokenset["oauth_token_secret"]);

2度目以降の利用時には、getAccessToken()で返される連想配列が["oauth_token"]、["oauth_token_secret"]、["screen_name"]、["user_id"]の4つから成ることを知っていると簡単。そのうち前者2つを使って、登録時と同様にnew TwitterOAuthすればOK。この流れと実現方法が体系的に説明されているサイトをなかなか見つけられずに苦労した。

★Twitter上での認証状態とサービス上での認証状態の連携
未解決課題なのだが…ユーザはTwitterとサービスの連携認証をいつでもTwitterサイト上から取り消せる。でもTwitter上から連携を解除されてしまうとサービス側のDBはそれに気づけず不整合になる。サービス側から必要に応じてTwitterの認証状態をチェックに行く機構が必要。


Web上の色々な情報を参考に一応動作するものが組めたが、当初は不案内な用語も多く戸惑うことが多かった。ブログを見ているとライブラリを使わずにOAuth認証部分をガリガリ自作している人はわずかのようだった。暗号化方式を指定してうんぬん、と話がややこしくなるため、今回はライブラリを使ってさくっと作ってみた。

参考になるサイト様は下記:

この記事についてTwitterでつぶやく

TortoiseHGの使い方

TortoiseHGの使い方。
今回は、サーバ上のレポジトリをローカルにコピーします。
ローカル側はEclipseのworkspaceに追加するような環境を想定しています。

まず、TortoiseHGをインストールしたら、まずは「ローカルのファイルをサーバ上のファイルと同期させる」ことからはじめます。

同期には"clone"と"update"があります。
初回だけが"clone"(レポジトリをローカルにコピーする)で、2回目以降は"update"(差分だけをもってくる)になります。

まずはcloneのやり方を紹介。
20110512_tortoisehg_clone

そうすると次の画面が出るので、設定する。

20110512_tortoisehg_clonedetail

クローンボタンを押せば、うまくいくはず。



この記事についてTwitterでつぶやく

ブレインストーミング

NHK「スタンフォード白熱教室」を見て
  • 最初にルールの確認。ブレストでの「当然」は、日常とは逆だったり。
  • 動きまわる、全員がペンを持ち、全員が見て書けるホワイトボードみたいなのが必要
  • "Yes, And" "Let me build on that" ⇒ あえて邦訳すると「しかも」「さらに」的な。。?
  • いろんな視点の人を連れてくる(車なら製造、量産、若いドライバ、お年寄り、メンテの人、etc)
  • 時間は「元気があるうち」、長くて30分とか45分とかだっけな。
  • 現実的じゃなくてもよいよ!Wildなアイディアもまたよい。
  • まとめる時には「Wild no.1」「現実的 no.1」みたいに複数部門で投票させるとよい。
扱っていた例は「1日の時間が足りない」に対して「夢のなかでみんなで知恵を結集して課題解決!」みたいなのも創造的でいいね!みたいな感じになってた。
そこから「現実的な解」に落としこんでいくのが難しいな。。。
そのへんも次の授業とかでやるのかな。毎回見たい。


この記事についてTwitterでつぶやく

Amazon Web Serviceがついに東京リージョンでサービスを開始!

数分前にAmazon Web Serviceから嬉しい告知が来た。
ついに東京地域でのWeb Service事業を開始するとのこと。米国西海岸/東海岸、ヨーロッパ、東南アジア(シンガポール)に次ぐ拠点が日本に出来たことで、AWSは遠くてもレスポンスタイムが。。。という懸念を持っていた人たちにも障壁が下がったのではないだろうか。

Amazon Web ServiceのWebサイトによると日本語での有償/無償のサポートが行われ、
数ヶ月以内には日本円での支払いも可能になるとのこと。
これらの要素も、AWSの利用について慎重であった個人利用者のAWS利用増加に拍車をかけることになるのではないかと思う。

Amazonからの告知文を以下に転載する。
今後の利用者の動向が楽しみである。

AWSの新しい アジアパシフィック東京リージョンが利用可能になりました!

日本でビジネスを行う企業様、また日本の顧客をもつグローバル企業の皆様は、本日より東京リージョンを使う事で、レイテンシーが低く、国内にデータ 保管ができる環境でアプリケーションの提供や作業が可能となります。そして自社インフラの運用、管理といった煩雑な作業から解放されます。ほとんどの場合 において日本のお客様は数ミリ秒という低いレイテンシーで新しい東京リージョンをご利用いただけます。 東京リージョンはシンガポールに次ぐアジアパシフィックでは2番目、全世界では5番目のAWSのクラウドの拠点となります。

また、AWSのベーシックおよびプレミアムサポートも日本語でご利用いただけるようになりました。AWSプレミアムサポートのお客様は、24時間 x365日体制でAWSに習熟したスタッフによる、個々に対応可能で迅速なレスポンスを持つサービスを日本語で受ける事ができます。AWSプレミアムサ ポートは問い合わせ回数に制限なく、月々のお支払いでご利用いただく事ができ、長期間の契約は不要です。

更に、数か月のうちには、日本円でのお支払いが可能になるオプションを提供予定です。

新しい東京リージョンでは現在次のサービスがご利用いただけます。 -- Amazon Elastic Compute Cloud (Amazon EC2)、Amazon Simple Storage Service (Amazon S3)、Amazon SimpleDB、Amazon Relational Database Service (Amazon RDS)、 Amazon Simple Queue Service (Amazon SQS)、Amazon Simple Notification Service (Amazon SNS)、Amazon CloudWatch、AWS CloudFormation、 Amazon Route 53、および Amazon CloudFront。

東京リージョンの価格は http://aws.amazon.com/products/ または http://aws.amazon.com/jp/products/ (日本語)でご確認いただけます。

新しいAWS東京リージョンをぜひご利用ください!



ちなみに三井物産やリクルートなど一部企業は「アーリー顧客」として既に東京リージョンのデータセンターを利用していたらしい。そのような契約が可能であったことのほうが私には驚きと言える。

この記事についてTwitterでつぶやく

UDPでデータ送信する:Java Applet編

UDPでデータ送信する方法のひとつに、Java Appletによる方法があったので、その方法を試してみた。
Java Appletについては最近の文献も少なく少し苦労した。たとえば、1度ブラウザでロードしたクラスファイルを再読込するには、Javaコンソールからキャッシュを明示的にクリアする点などはなかなか分からなかった。
特に署名付きAppletを作ったのははじめてだったので、そのあたりでも骨が折れた。

・コード
送信側コード。至って単純。

import java.awt.Color;
import java.awt.Graphics;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class SenderApp extends Applet {
	public void paint(Graphics g) {
		try {
			// 通信用ソケット準備
			DatagramSocket sock = new DatagramSocket();

			/*** UDPパケット送信 ***/
			// 送信文字列準備
			String sendString = "test message";
			byte[] sendBuffer = sendString.getBytes("JIS");	// 文字コードの指定
			// ソケット準備
			InetSocketAddress remoteAddress = new InetSocketAddress("127.0.0.1",13500);
			// UDPパケット作成
			DatagramPacket sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, remoteAddress);
			
			// 送信
			sock.send(sendPacket);			
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
続いて受信側。これまた単純。
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class ReceiverApp extends Applet {
	public void paint(Graphics g) {
			try {
				
				/***** UDPパケット受信 *****/
				DatagramSocket receiveSocket = new DatagramSocket(13500);
				
				// 再利用可能にする
				// receiveSocket.setReuseAddress(true);

				// 受信バッファ
				byte[] receiveBuffer = new byte[100];
				// 受信パケット
				DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, 100);
				// 受信
				receiveSocket.receive(receivePacket);
				// 受信文字列格納
				String receiveString = new String(receivePacket.getData());

				// ソケットを閉じる
				receiveSocket.close();
				
				// 描画!
				g.setColor(Color.RED);
				g.drawString(receiveString, 30, 30);
				
			} catch (SocketException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
}
ソースコードは以上。コーディングの際には下記のサイトを参考にした。

Javaの道 >  掲示板 >  回答(JavaアプレットからUDPにメッセージ送信したい)
http://www.javaroad.jp/bbs/answer.jsp?q_id=20060907104644159

【コラム】 ライトニングJava
http://journal.mycom.co.jp/column/java/052/index.html

・署名付きAppletの作成
はじめてだったので検討もつかなかった作業。
以下のサイトが詳しい。ちなみに私は実はJDKが入っていなくてまずそのインストールからはじめました。。。

Java RADKRAFT: Java Applet + SignatureApplet マイク
http://kamakura.cool.ne.jp/oppama/misc/java-plugin-sig.html

・CLASSファイルではなくJARファイルを読み込むHTMLの書き方
テクニカルQ&A  Java 04 - アプレットで .zip や .jar ファイルを使う
http://developer.apple.com/jp/qa/java/java04.html

盲点。
先日の記事で「JobsはJavaが嫌い~」とか言っていたのに、皮肉なことにAppleのWebサイト。しかも12年前の記事。笑。

・CLASS/JARファイルを更新したらキャッシュを明示的にクリア
以下のサイトがなかったらずっとはまっていたと思う。
Java Appletの記事で2005年は比較的新しい。。笑。

Java Primer: アプレットの再読み込み
http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Doc/java_primer/AppletReload.html

とりあえず、これらの情報を参考に上記のコードからCLASSファイル、JARファイル、keyによる署名を行ったところ、localhost同士ではうまく通信できた。
あとは実際にNATを越えてUDP通信する方法について考える必要がある。
試しにネットワーク外部の人と通信を試みたが失敗。。。NATの設定の問題によると思うので、ひとまず固定IPの相手と通信が確立した後、改めて検討したい。

この記事についてTwitterでつぶやく
Profile
記事検索
Twitter
Access



    • ライブドアブログ