前回の 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 をセッションに保管してあります
(最初は引数へ格納していましたが、進化の途中の残骸ですので、適宜にチューニングしてくださいね!)
一応、テストさせて頂いてるサイトさんでは、これでリフレッシュできてますが、他のサイトさんでは未確認
ステータスに応じて処理する機能を追加できる様になったけど、文字じゃなくで数値化した方がステータスコードに反応しやすいかもしれないね!