array( 'method' => 'POST' , 'content' => http_build_query( array( 'consumer_key' => $consumer_key , 'code' => $_SESSION['code'] , ) ) , ) , ) ; // CURLを使ってリクエスト $curl = curl_init() ; // オプションのセット curl_setopt( $curl , CURLOPT_URL , 'https://getpocket.com/v3/oauth/authorize' ) ; curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ; // メソッド curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書の検証を行わない curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す curl_setopt( $curl , CURLOPT_POSTFIELDS , $context['http']['content'] ) ; // リクエストボディ curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数 // 実行 $res1 = curl_exec( $curl ) ; $res2 = curl_getinfo( $curl ) ; // 終了 curl_close( $curl ) ; // 取得したデータ $body = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど) $header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ) // 関数[pocket_get_query_syncer]を使って、GETパラメータ形式の文字列を配列に変換 $query = pocket_get_query_syncer( $body ) ; // CSRF対策 if( !isset($query['state']) || empty($query['state']) || $query['state'] != $_SESSION['state'] ) { $error = 'セッションに保存してあるstateと、返ってきたstateの値が違います…。' ; } // アクセストークンが取得できない場合はエラー elseif( !isset($query['access_token']) || empty($query['access_token']) ) { $error = 'アクセストークンを取得できませんでした…。' ; } else { // アクセストークンを変数に格納 $access_token = $query['access_token'] ; // 出力する $html .= '

実行結果

' ; $html .= '
' ; $html .= '
ユーザーID
' ; $html .= '
' . $query['username'] . '
' ; $html .= '
アクセストークン
' ; $html .= '
' . $access_token . '
' ; $html .= '
' ; } } // 出力する $html .= '

取得したデータ

' ; $html .= '

下記のデータを取得しました。

' ; $html .= '

ボディ

' ; $html .= '

' ; $html .= '

レスポンスヘッダー

' ; $html .= '

' ; // アプリケーション連携の解除 $html .= '

アプリケーション連携の解除

' ; $html .= '

このアプリケーションとの連携は、下記設定ページで解除することができます。

' ; $html .= '

https://getpocket.com/connected_applications

' ; // セッション終了 $_SESSION = array() ; session_destroy() ; } // [return=1]がないアクセス(初回アクセス)の場合 // [手順1] pocketからリクエストトークンを取得する、の部分 else { // CSRF対策 session_regenerate_id( true ) ; $state = sha1( uniqid( mt_rand() , true ) ) ; $_SESSION['state'] = $state ; // リダイレクトURLにパラメータを追加 $redirect_uri .= '?return=1' ; // リクエスト用のコンテキストを作成 $context = array( 'http' => array( 'method' => 'POST' , 'content' => http_build_query( array( 'consumer_key' => $consumer_key , 'redirect_uri' => $redirect_uri , 'state' => $state , ) ) , ) ) ; // CURLを使ってリクエスト $curl = curl_init() ; // オプションのセット curl_setopt( $curl , CURLOPT_URL , 'https://getpocket.com/v3/oauth/request' ) ; curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ; // メソッド curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ; // 証明書の検証を行わない curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ; // curl_execの結果を文字列で返す curl_setopt( $curl , CURLOPT_POSTFIELDS , $context['http']['content'] ) ; // リクエストボディ curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ; // タイムアウトの秒数 // 実行 $res1 = curl_exec( $curl ) ; $res2 = curl_getinfo( $curl ) ; // 終了 curl_close( $curl ) ; // 取得したデータ $body = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど) $header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ) // 関数[get_query_syncer]を使って、GETパラメータ形式の文字列を配列に変換 $query = pocket_get_query_syncer( $body ) ; // リクエストトークンを取得できなければエラー if( !isset($query['code']) || empty($query['code']) ) { $error = 'リクエストトークンが取得できませんでした。多分コンシューマーキーの設定が間違っています。' ; } // リクエストで送った[state]の値と、返って来た[state]の値が違ったらエラー elseif( !isset($query['state']) || empty($query['state']) || $state != $query['state'] ) { $error = '不正なリクエスト、またはレスポンスです…。' ; } else { // セッションにリクエストトークンの値を格納しておく $_SESSION['code'] = $query['code'] ; // ユーザーをアプリ認証画面へアクセス(リダイレクト)させる // [手順2] ユーザーがそのリクエストトークンを持って、pocketの「アプリ認証画面」にアクセスする、の部分 header( 'Location: https://getpocket.com/auth/authorize?request_token=' . $query['code'] . '&redirect_uri=' . $redirect_uri ) ; } } // エラー時の処理 if( isset($error) || !empty($error) ) { $html = '

' . $error . 'もう一度、認証をするには、こちらをクリックして下さい。

' ; } // GETクエリ形式の文字列を配列に変換する関数 function pocket_get_query_syncer( $data = '' ) { // 文字列を[&]で区切って配列に変換する $ary = explode( '&' , $data ) ; // [&]が含まれていない場合は終了 if( 2 > count( $ary ) ) { return false ; } // 文字列を配列に整形する foreach( $ary as $items ) { $item = explode( '=' , $items ) ; $query[ $item[0] ] = $item[1] ; } // 返却 return $query ; } ?> pocket APIでOAuth認証をするサンプルデモ

配布元: Syncer