OAuth の認証 (続き)

この記事は公開されてから時間が経っています

前回の の認証部分に進化があったので、忘れないように書いておこう!

HTTP のステータスをチェックしてリフレッシュする機能を付けてみたけど…
機能が付いてソースが太ったので関数化した…
冗長なのででかいけど、スリム化できると思う…

// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
//
//    アクセストークン取得
//

function getAccessToken(&$access_token,&$refresh_token){

    $params = array(
        'grant_type' =>       'authorization_code',
        'client_id' =>        CLIENT_ID,
        'client_secret' =>    CLIENT_SECRET,
        'redirect_uri' =>     CALLBACK_URL,
        'code' =>             $_GET['code'],
    );

    $headers = array(
        'Content-Type: application/x-www-form-urlencoded',
        'Content-Length: '.strlen(http_build_query($params))
    );
 
    $options = array(
        'http' => array(
            'method' => 'POST',
            'ignore_errors' => true,
            'content' => http_build_query($params),
            'header' => implode("\r\n",$headers)
        )
    );

    $res = file_get_contents(TOKEN_URL, false, stream_context_create($options));

    //    HTTP result

    $matches    = NULL;
    preg_match('/HTTP\/1\.[0|1|x] ([0-9]{3})/', $http_response_header[0], $matches);
    $status_code = $matches[1];

    switch ($status_code) {
        case '200':
            // 200の場合
            break;
        case '401':
            $res = tokenRefresh();
            break;
        default:
              echo 'access token get error HTTP status '.$status_code;
              exit;
            break;
    }

//    echo 'access token "'.$status_code."\"<br />\n";

    // レスポンス取得
    $token = json_decode($res, true);
    if(isset($token['error'])){
        echo 'エラー発生';
        exit;
    }

    $access_token     = $token['access_token'];
    $refresh_token    = $token['refresh_token'];
}

// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
//
//    token refresh
//

function tokenRefresh(){

    if( !isset($_SESSION['refresh_token']) || strlen(trim($_SESSION['refresh_token'])) <= 0){
        echo 'token get fail : refresh not found';
        exit;
    }
    $refresh_token    = $_SESSION['refresh_token'];

    $params = array(
        'grant_type' =>       'refresh_token',
        'client_id' =>        CLIENT_ID,
        'client_secret' =>    CLIENT_SECRET,
        'redirect_uri' =>     CALLBACK_URL,
        'refresh_token' =>    $refresh_token
    );

    $headers = array(
        'Content-Type: application/x-www-form-urlencoded',
        'Content-Length: '.strlen(http_build_query($params))
    );
 
    $options = array(
        'http' => array(
            'method' => 'POST',
            'ignore_errors' => true,
            'content' => http_build_query($params),
            'header' => implode("\r\n",$headers)
        )
    );

    $res = file_get_contents(TOKEN_URL, false, stream_context_create($options));

    //    HTTP result

    preg_match('/HTTP\/1\.[0|1|x] ([0-9]{3})/', $http_response_header[0], $matches);
    $status_code = $matches[1];

    switch ($status_code) {
        case '200':
            // 200の場合
            break;
        default:
            //    ログアウトしている
            header("Location: " . ERR_LOGOUT);
//          echo 'refresh token get error HTTP status '.$status_code;
//          exit;
//          break;
    }

//    echo 'refresh token'.$status_code."<br />\n";

//    print_r($res);
    return $res;
}

途中で $_SESSION に アクセストークンとリフレッシュトークンを保管する処理があります
上の関数の戻ったあたりで、access_token と refresh_token をセッションに保管してあります
(最初は引数へ格納していましたが、進化の途中の残骸ですので、適宜にチューニングしてくださいね!)

一応、テストさせて頂いてるサイトさんでは、これでリフレッシュできてますが、他のサイトさんでは未確認

ステータスに応じて処理する機能を追加できる様になったけど、文字じゃなくで数値化した方がステータスコードに反応しやすいかもしれないね!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です