前々回のOAuthについてまとめてみた、前回のJavaでOAuthをやっつける方法に続いて今回はPHPでOAuth認証を利用したAPIへのアクセスを実装してみる。
今回も、天下のoauth.netのoauthライブラリ(Google Code)を使う。oauthのリポジトリからOAuth.phpを持ってくれば準備完了。
すぐ使いたい時
Java版と併せてライブラリにまとめてみたのでここ(Google Code)から取得してもらうと、簡単に実装できる。HowToUse.phpを見てもらうのが手っ取り早いけど、How to use for phpにも触りだけ書いてあるのでよかったら見てください。
やること
- 各種の設定を定義
- リクエストトークンを取得する
- ユーザーにアプリケーションを承認してもらう
- アクセストークンを取得する
各種の設定を定義
サービスプロバイダーのエンドポイント情報やコンシューマの情報を、下記のように定義する。
$TOMOKEY = array( 'CONSUMER_KEY' => 'anonymous', 'CONSUMER_SECRET' => 'anonymous', 'CONSUMER_CALLBACK_URL' => 'oob', 'REQUEST_TOKEN_URL' => 'https://www.google.com/accounts/OAuthGetRequestToken', 'USER_AUTHORIZATION_URL' => 'https://www.google.com/accounts/OAuthAuthorizeToken', 'ACCESS_TOKEN_URL' => 'https://www.google.com/accounts/OAuthGetAccessToken' );
※Goole Data APIをクライアントアプリから利用する例なので、ウェブアプリの場合とかはJavaでOAuthをやっつけるを参照。
リクエストトークンを取得する
Step1.コンシューマ情報をオブジェクト化
// consumer info $consumer_key = $consumer_config['CONSUMER_KEY']; $consumer_secret = $consumer_config['CONSUMER_SECRET']; $consumer_callback = $consumer_config['CONSUMER_CALLBACK_URL']; // OAuthConsumerオブジェクトを構築 $consumer = new OAuthConsumer( $consumer_key, $consumer_secret, $consumer_callback);Step2.署名ツールを生成
// 署名方式はHMAC-SHA1 $signature_method = new OAuthSignatureMethod_HMAC_SHA1();
※今回はよく使うSHA-1方式にしとく。Step3.パラメータを生成
$params = array( 'oauth_callback' => $consumer->callback_url, 'scope' => 'https://www.google.com/calendar/feeds/');
※Google Calendar APIにアクセスする例なので、scopeというパラメータも設定してる。Step4.リクエストオブジェクトを生成
$request = OAuthRequest::from_consumer_and_token( $consumer, NULL, // RequestToken取得時は不要 'GET', $TOMOKEY['REQUEST_TOKEN_URL'], $params); // 署名する $request->sign_request($signature_method, $consumer, NULL);
※先につくっておいたOAuthConsumerオブジェクト、パラメータを使ってリクエストオブジェクトを生成し、署名ツールで署名を行う。Step5.HTTP通信を行う。
// cURLリソースの生成 $ch = curl_init(); // Locationヘッダは無視 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // サーバ証明書の検証を行わない curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // レスポンスを文字列として取得する設定 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // (出力結果に)ヘッダを含めない curl_setopt($ch, CURLOPT_HEADER, false); // URLを指定 curl_setopt($ch, CURLOPT_URL, $request->to_url()); // 実行 $result = curl_exec($ch); // close curl resource to free up system resources curl_close($ch); // レスポンスを解析 parse_str($result, $result_map); // リクエストトークンを取得 $req_token = new OAuthToken( $result_map['oauth_token'], $result_map['oauth_token_secret']);
※POSTで送信する場合には、CURLOPT_URLには、to_url()の代わりにget_normalized_http_url()を使うのと、CURLOPT_HTTPHEADERにarray($request->to_header)ってな感じでAuthorizationパラメータ設定が必要。その他の詳細はコード(httpという名称のfunction)を参照。
ユーザーにアプリケーションを承認してもらう
下記のように作成したURLに対して、ブラウザでアクセスしてもらう。PHPならheaderでリダイレクトするのが一般的なのかな?
// サービスプロバイダーが定義しているエンドポイント $auth_url = $TOMOKEY['USER_AUTHORIZATION_URL']; // ここで作成したURLにアクセスしてもらう $url = $auth_url . '?' . OAuthUtil::build_http_query(array('oauth_token' => $req_token->key));
※承認画面が表示されて、ポチっとした後はcallback URLにリダイレクト or 画面にverifier表示。
アクセストークンを取得する
Step1.色々
リクエストトークンの取得と同じ手順でコンシューマ情報のオブジェクト化と署名ツールの生成を行う。 ちなみに、取得しておいたリクエストトークンは、この後使うのでセッションとかデータストアとかを使って保存しておく必要がある。Step2.パラメータを生成
$params = array('oauth_verifier' => $verifier);
※ここで使用している$verifierは、ユーザー承認により取得した文字列のこと。callback URLが指定されているなら、リダイレクト先にoauth_verifierとして送信される。Step3.リクエストオブジェクトを生成
$request = OAuthRequest::from_consumer_and_token( $consumer, $req_token, // 保存しておいたリクエストトークンオブジェクト 'GET', $TOMOKEY['ACCESS_TOKEN_URL'], $params); // 署名する $request->sign_request($signature_method, $consumer, $req_token);
※リクエストトークンの取得時と異なるのは3点。Step4.HTTP通信を行う。
- URLがACCESS_TOKEN_URL
- リクエストトークンを送信する
- 署名鍵としてリクエストトークンのシークレットの方も利用する
この手順は前述と同じ。最後に取得できるのがアクセストークンってとこだけ違う。
終わり
アクセストークンを使ってAPIアクセス方法は、アクセストークンの取得手順でリクエストトークンの代わりにアクセストークンを指定した場合と同じ。
だけど、リダイレクトの考慮をしないとGoogle Calendar APIとかは使えないので、コード(invokeという名称のfunction)をご参照あれ。
0 件のコメント:
コメントを投稿