[salesforce][twitter]Force.com APEXにおけるOauth認証を使用したTwitterAPIのアクセス方法について

By |10月 4, 2011|salesforce, twitter, |


TwitterのAPIをForce.com上で使用するため、Oauth認証を用いたAPEXのライブラリを探してみましたが
これといったライブラリが見つからなかったため、自前で作成しました。

Webアプリにおいて、Oauth認証を用いて、TwitterAPIを利用するには以下の手順が必要となります。
 Twitterにログインして、アプリ情報を登録する。
 登録したアプリの情報を使用し、Twitterに通信してRequest tokenを取得する。
 Request tokenを使用して、Twitter認証画面にリダイレクトする。
 Twitter認証画面から戻ってきた際に付加されたGETパラメータを使用してAccesstokenを取得する。
 Access tokenを使用して、各TwitterのAPIをコールする。

上記を踏まえて、下記に自分のタイムラインを表示する説明および例を記載します。

Twitterにログインして、アプリ情報を登録します。
※こちらは参考サイトが多数ありますので説明は割愛します。

アプリ登録画面に表示されたConsumer key、Consumer secret、Request token URLを使用してRequest tokenを取得します。Request token URLに対して、下記GETパラメータを付加して通信を行います。

パラメータ名
oauth_callback Twitterの認証画面からコールバックされる任意のURLをエンコードした文字列(アプリ登録時にも設定しますが、こちらが優先されます)
oauth_consumer_key アプリ登録画面に表示された文字列
oauth_nonce ハッシュを用いたその場限りの文字列(例では乱数とアクセス日時を利用して、MD5に変換しています)
oauth_signature_method HMAC-SHA1’固定
oauth_timestamp 現在時刻(UNIXタイムスタンプ形式)
oauth_version 1.0’固定
oauth_signature 送信するURLから当パラメータを除いた文字列を、HMAC-SHA1形式に変換したハッシュ値
<パラメータの指定方法(要点のみ記載)>
・oauth_callback

[php]
Encodingutil.urlEncode(‘任意のURL’,’UTF8′)
[/php]

・oauth_nonce

[php]
//1~9の値を使用して乱数を作成する
String CharList = ‘123456789’;
String Res = ”;
integer position;
//8桁の乱数を作成
for(Integer i = 0; i < 8; i++) {
position = Integer.valueof(String.valueof(Math.roundToLong(CharList.length()*Math.random()))) -1;
if(position==-1)position=0;
Res += CharList.substring(position,position+1);
}
//現在のミリ秒を戻す
DateTime d = System.now();
String now_mm_second = String.valueOf(d.year() + d.month() + d.day() + d.hour() + d.minute() + d.second() + d.millisecond());
//乱数と現在日時を繋げた値からMD5に変換し、この値をセットする
EncodingUtil.convertToHex(Crypto.generateDigest(‘MD5’, Blob.valueOf(now_mm_second + Res))) ;
[/php]

・oauth_timestamp

[php]
String.valueOf(Datetime.now().getTime()).substring(0, 10);
[/php]

・oauth_signature

[php]
//送信方式、送信URL、送信パラメータを&区切りでセットし、URLエンコードを行う
//注意点としてはoauth_callbackのURLは2回URLエンコードを行うイメージ
String sSignatureSource = ‘GET&
https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&
oauth_callback%3D【任意のURLを2回エンコードした文字列】%26
oauth_consumer_key%3D【アプリ登録画面に表示されたConsum key】%26
oauth_nonce%3D【上記方法で作成した文字列】%26
oauth_signature_method%3DHMAC-SHA1%26
oauth_timestamp%3D【上記方法で取得した文字列】%26
oauth_version%3D1.0′;

//アプリ登録画面で表示されたConsumer secretを利用してHMAC-SHA1ハッシュ変換で使用するキーを作成
String sHashKey = 【アプリ登録画面に表示されたConsumer secret】+’&’;

//上記で作成した2つの文字列を使用して、oauth_signatureの値を作成
Blob blbSignature = Crypto.generateMac(‘HMacSHA1’, Blob.valueOf(sSignatureSource),Blob.valueOf(sHashKey));
EncodingUtil.urlEncode(EncodingUtil.base64Encode(blbSignature), ‘UTF-8’);
[/php]

<Twitterに通信するURLの例>
https://api.twitter.com/oauth/request_token?
oauth_callback=http%3A%2F%2Fhogehoge.com%2F&
oauth_consumer_key=XXXXXXXXXXXXXXXXXXXXXX&
oauth_nonce=b1d9973f5b385f46aee43f8becbf79cc&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1317642915&
oauth_version=1.0&
oauth_signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

<Twitterからの戻り値(テキスト形式)>
oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_token_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_callback_confirmed=true

Request tokenを使用して、Twitter認証画面にリダイレクトします。この際に一度画面から離れてしまうためoauth_token、oauth_token_secretをカスタムオブジェクトに保持しておきます。

[php]
//カスタムオブジェクトに登録
TwitterRequestToken__c oTwiOa_ins = new TwitterRequestToken__c();
oTwiOa_ins.token__c = oauth_token;
oTwiOa_ins.token_secret__c = oauth_token_secret;
insert oTwiOa_ins;

//ログイン画面にリダイレクト
PageReference pTwitterLogin = new PageReference(‘https://twitter.com/oauth/authenticate?oauth_token=’+oauth_token);
return pTwitterLogin.setRedirect(true);
[/php]

※アプリ登録画面のAuthorize URLではhttps://api.twitter.com/oauth/authorizeが表示されますが、上記のURL(/authenticate)を使用することで、既にTwtterにログイン済みでアプリの許可を行っている場合は認証画面が表示されず、コールバックに指定したURLに直接リダイレクトされます。

コールバックされた際のGETパラメータであるoauth_token、oauth_verifierを使用してAccess tokenを取得します。アプリ登録画面に表示されたAccess token URLに対して、下記GETパラメータを付加して通信を行います。またoauth_token_secretも使用するので、先ほど登録したカスタムオブジェクトより、GETパラメータのoauth_tokenを条件に抽出します。

パラメータ名
oauth_consumer_key アプリ登録画面に表示された文字列
oauth_nonce ハッシュを用いたその場限りの文字列(例では乱数とアクセス日時を利用して、MD5に変換しています)
oauth_signature_method HMAC-SHA1’固定
oauth_timestamp 現在時刻(UNIXタイムスタンプ形式)
oauth_version 1.0’固定
oauth_token コールバックされた際のGETパラメータ
oauth_verifier コールバックされた際のGETパラメータ
oauth_signature 送信するURLから当パラメータを除いた文字列を、HMAC-SHA1形式に変換したハッシュ値
<パラメータの指定方法(要点のみ記載)>
・oauth_signature

[php]
//Request token取得で作成した方法と基本的には同じ
//異なる点としてHMAC-SHA1ハッシュ変換で使用するキーにoauth_token_secretも使用
String sSignatureSource = ‘GET&
https%3A%2F%2Fapi.twitter.com%2Foauth%2Faccess_token&
oauth_consumer_key%3D【アプリ登録画面に表示されたConsum key】%26
oauth_nonce%3D【コールバック後、再作成するnonce文字列】%26
oauth_signature_method%3DHMAC-SHA1%26
oauth_timestamp%3D【コールバック後、再取得するtimestamp文字列】%26
oauth_token%3D【コールバックされた際のGETパラメータ】%26
oauth_verifier%3D【コールバックされた際のGETパラメータ】%26
oauth_version%3D1.0’;

//アプリ登録画面で表示されたConsumer secretおよびReqest tokenを利用してHMAC-SHA1ハッシュ変換で使用するキーを作成
String sHashKey = 【アプリ登録画面に表示されたConsumer secret】+’&’+【カスタムオブジェクトより取得したoauth_token_secret】;

//上記で作成した2つの文字列を使用して、oauth_signatureの値を作成
Blob blbSignature = Crypto.generateMac(‘HMacSHA1’, Blob.valueOf(sSignatureSource),Blob.valueOf(sHashKey));
EncodingUtil.urlEncode(EncodingUtil.base64Encode(blbSignature), ‘UTF-8’);
[/php]

<Twitterに通信するURLの例>
https://api.twitter.com/oauth/access_token?
oauth_consumer_key=XXXXXXXXXXXXXXXXXXXXXX&
oauth_nonce=c04cc4ffc2d54cec65246060aa20b145&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1317642918&
oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_verifier=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_version=1.0&
oauth_signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

<Twitterからの戻り値(テキスト形式)>
oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_token_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
user_id=XXXXXXXXX&
screen_name=ログインしたユーザ名

Access tokenを使用して、ログインユーザのタイムライン情報を取得します。
※各APIのアクセスURLについては他サイトに多数ありますので、そちらを参照してください。

ユーザのタイムラインを取得するURL:http://api.twitter.com/1/statuses/home_timeline.xml

パラメータ名
oauth_consumer_key アプリ登録画面に表示された文字列
oauth_nonce ハッシュを用いたその場限りの文字列(例では乱数とアクセス日時を利用して、MD5に変換しています)
oauth_signature_method HMAC-SHA1’固定
oauth_timestamp 現在時刻(UNIXタイムスタンプ形式)
oauth_token ④で取得したAccess token
oauth_version 1.0’固定
oauth_signature 送信するURLから当パラメータを除いた文字列を、HMAC-SHA1形式に変換したハッシュ値
<パラメータの指定方法(要点のみ記載)>
・oauth_signature

[php]
//Access token取得で作成した方法と基本的には同じ
//異なる点としてはHMAC-SHA1ハッシュ変換で使用するキーにRequest tokenのoauth_token_secretから
//Access tokenのoauth_token_secretに変更
String sSignatureSource = ‘GET&
http%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fhome_timeline.xml&
oauth_consumer_key%3D【アプリ登録画面に表示されたConsum key】%26
oauth_nonce%3D【リクエスト時に再作成するnonce文字列】%26
oauth_signature_method%3DHMAC-SHA1%26
oauth_timestamp%3D【リクエスト時に再取得するtimestamp文字列】%26
oauth_token%3D【Access token】%26
oauth_version%3D1.0%26
source_screen_name%3D【ユーザ名】’;

//アプリ登録画面で表示されたConsumer secretおよびAccess tokenを利用してHMAC-SHA1ハッシュ変換で使用するキーを作成
String sHashKey = 【アプリ登録画面に表示されたConsumer secret】+’&’+【Access tokenのoauth_token_secret】;

//上記で作成した2つの文字列を使用して、oauth_signatureの値を作成
Blob blbSignature = Crypto.generateMac(‘HMacSHA1’, Blob.valueOf(sSignatureSource),Blob.valueOf(sHashKey));
EncodingUtil.urlEncode(EncodingUtil.base64Encode(blbSignature), ‘UTF-8’);
[/php]

<Twitterに通信するURLの例>
http://api.twitter.com/1/statuses/home_timeline.xml?
oauth_consumer_key=XXXXXXXXXXXXXXXXXXXXXX&
oauth_nonce=718a0e118eed5d6c4dfa628a13b41b5b&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1317642919&
oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_version=1.0&
source_screen_name=表示ユーザ&
oauth_signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

<Twitterからの戻り値(テキスト形式)>
タイムラインのXML文字列

ここまでが一連の流れとなります。AccessTokenについてはユーザ・アプリ単位で一意となり
無期限で使用できるため、予め使用ユーザが分かっていれば上記④までの初回のみでOKです。
※RequestTokenについては1度しか使用できないようです。

また上記のサンプルソースをこちらで公開しています。