« twitterでOAuthを使う方法(その1:認証まで) | トップページ | さくらインターネットサーバでpear (厄介なバージョンに当たった人向け) »

twitterでOAuthを使う方法(その2:前回の続き〜APIにアクセスしてみる)

前回のおはなし。
twitterでOAuthを使う方法(その1:認証まで)
認証までの手順を説明しました。
・前準備:コンシューマの登録
・ユーザからのリクエスト→サービスプロバイダへリクエストトークンを要求
・サービスプロバイダの認証画面へリダイレクト→サービスプロバイダの承認
・サービスプロバイダへアクセストークンを要求

前回の説明で、署名に関して説明不足の点がありました。

リクエストに絡む情報すべて(※1)ですが、
・リクエストヘッダ
・POSTメソッドによる本体
・GETメソッドのquery_string
すべてを、「&」で結んだあとに、一括してurlencodeします。

これら3つに関して、『全部を』アルファベット順にソートしてから、&でつなげます。
三者間に優先順位・区別はなく、すべてを通してのソートです。
たとえば、
・リクエストヘッダ「a: 60」「c: 30」「g: 40」
・POSTメソッド「b=11」「e=50」
・GETのquery_string「d=24&f=33&h=66」
こういうふうに与えられてる場合、
a=60&b=11&c=30&d=24&e=50&f=33&g=40&h=66
というふうになります。

面倒なんで、コードで書くとこんなかんじです。

  // make signature --> See 9.2
private function MakeSignature( $ca_method , $ca_request_uri , $ca_header ,$ca_data ,
$ca_consumer_secret , $ca_token_secret ) {
$cl_dataarray = array() ;
// もとになるデータを生成
// Header
if ( $ca_header != NULL ) {
foreach ( $ca_header as $cl_key => $cl_val ) {
$cl_data = $cl_key . "=" . $cl_val ;
array_push( $cl_dataarray , $cl_data ) ;
}
}
// POST body
if ( $ca_data != NULL ) {
foreach ( $ca_data as $cl_key => $cl_val ) {
$cl_data = $cl_key . "=" . $cl_val ;
array_push( $cl_dataarray , $cl_data ) ;
}
}
// query_string for GET
if ( ereg( "\?" , $ca_request_uri ) ) {
$cl_uri_spl = explode( "?" , $ca_request_uri , 2 ) ; // split -> explode
$cl_request_uri = $cl_uri_spl[0] ;
if ( $cl_uri_spl[1] != "" ) {
$cl_req_qry = explode( "&" , $cl_uri_spl[1] ) ;
foreach( $cl_req_qry as $cl_data ) {
array_push( $cl_dataarray , $cl_data ) ;
}
}
} else {
$cl_request_uri = $ca_request_uri ;
}

$cl_count = 0 ;
$cl_dataall = "" ;
sort( $cl_dataarray ) ;
foreach ( $cl_dataarray as $cl_key => $cl_val ) {
if ( $cl_count > 0 ) {
$cl_dataall .= "&" ;
}
$cl_dataall .= $cl_val ;
$cl_count ++ ;
}

$cl_base = $ca_method . "&" . urlencode( $cl_request_uri ) ."&" . urlencode( $cl_dataall ) ;
$cl_base = ereg_replace( "\+" , "%20" , $cl_base ) ; // +ではなく%20で。
$cl_key = $ca_consumer_secret . "&" . $ca_token_secret ;

// HMAC-SHA1 でhash値生成
$cl_hash = hash_hmac( 'sha1' , $cl_base , $cl_key , TRUE ) ;

// 結果の処理
$cl_enc = base64_encode( $cl_hash ) ; // まずはbase64エンコードして
$cl_enc = ereg_replace( '\n' , '' , $cl_enc ) ;
$cl_enc2 = urlencode( $cl_enc ) ; // 続いてurlencodeする( 5.1 )

return $cl_enc2 ;
}


●APIへのアクセス (7)
OAuthを使う場合、APIへのアクセス方法は、
・リクエストヘッダにoAuth関連のパラメータを埋める
・GETのquery stringに埋める
・POSTの送信データに埋める
の3つの方法があります。
twitterの場合、残念ながら(リバースプロキシの関係?)、リクエストヘッダに埋める方法には対応しておりません(503エラーがかえってきます。ついでに、くじらさんが拝めます)。
従って、GET/POSTの(フォーム)データに埋めるしかありません。

与えるパラメータは以下の通りです。
・oauth_consumer_key ・・・ コンシューマのキー
・oauth_token ・・・ステップ4で(正式発行された) アクセストークン
あと、必要なもの
・OAuthのバージョン (oauth_version )
・タイムスタンプ ( oauth_timestamp )
・当該アクセスに対して、一意性を表す文字列( oauth_nonce )
・署名のプロトコル( oauth_signature_method )
・署名( oauth_signature )
そして、
・APIに与えるパラメータ

署名の作成ですが、例によって、署名以外のデータを対象にします。
署名に使うキーですが、 oauth_consumer_secret と oauth_token_secret (ステップ4で発行されたもの) を "&" でつないだものを使います。

リクエストを投げる先は、これまで通りのAPIのURIです。


○あと、気がついたこと。
認証の許可と解除を繰り返したせいかはわかりませんが。
気のせいか、updateのAPIがやたら不安定です。
よく『401 Not Authorized』を返してきます。署名が一致しないようで。

|

« twitterでOAuthを使う方法(その1:認証まで) | トップページ | さくらインターネットサーバでpear (厄介なバージョンに当たった人向け) »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: twitterでOAuthを使う方法(その2:前回の続き〜APIにアクセスしてみる):

« twitterでOAuthを使う方法(その1:認証まで) | トップページ | さくらインターネットサーバでpear (厄介なバージョンに当たった人向け) »