oauth 2.0 - How to get a refresh_token with an auto-approved response? -
i have following code:
if (isset($_request['logout'])) { unset($_session['upload_token ']); } if (isset($_get['code'])) { $client->authenticate($_get['code']); $_session['upload_token'] = $client->getaccesstoken(); $redirect = 'http://' . $_server['http_host'] . $_server['php_self']; header('location: ' . filter_var($redirect, filter_sanitize_url)); } if (isset($_session['upload_token']) && $_session['upload_token']) { $client->setaccesstoken($_session['upload_token']); if ($client->isaccesstokenexpired()) { echo "the access token expired.<br>"; // debug $client->refreshtoken(json_decode($_session['upload_token'])); unset($_session['upload_token']); } } else { $authurl = $client->createauthurl(); }
and receiving following error:
uncaught exception 'google_auth_exception' message 'the oauth 2.0 access token has expired, , refresh token not available. refresh tokens not returned responses auto-approved.'
i assuming getting error because response auto-approved.
what should changed?
update: i've tried adding code:
$client->setaccesstype("online"); $client->setapprovalprompt("auto");
based on this question. still receiving same error of missing refresh token.
update: after kroikie's update, code looks following:
$client = new google_client(); $client->setclientid($client_id); $client->setclientsecret($client_secret); $client->setredirecturi($redirect_uri); $client->addscope("https://www.googleapis.com/auth/drive"); $client->setaccesstype("offline"); $client->setapprovalprompt("auto"); $client->setapplicationname("appraisal app"); $service = new google_service_drive($client); if (isset($_request['logout'])) { unset($_session['upload_token ']); } if (isset($_get['code'])) { $resp = $client->authenticate($_get['code']); $_session['upload_token'] = $client->getaccesstoken(); $array = get_object_vars(json_decode($resp)); // store , use $refreshtoken new access tokens $refreshtoken = $array['refreshtoken']; $redirect = 'http://' . $_server['http_host'] . $_server['php_self']; header('location: ' . filter_var($redirect, filter_sanitize_url)); } if (isset($_session['upload_token']) && $_session['upload_token']) { $client->setaccesstoken($_session['upload_token']); if ($client->isaccesstokenexpired()) { echo "the access token expired. let raph know saw this.<br>"; $client->refreshtoken($refreshtoken); unset($_session['upload_token']); } } else { $authurl = $client->createauthurl(); }
unfortunately, still receive same fatal error when refresh token needed.
when access type offline, access token , refresh token returned when user first grants data access. access token can used access user's data, , refresh token stored , used new access token when initial access token has expired.
so try using offline access type
$client->setaccesstype('offline');
and use refresh token refresh client's access token
// $refreshtoken retrieved response of // user's initial granting access $client->refreshtoken($refreshtoken)
update: refresh token use like:
if (isset($_get['code'])) { $resp = $client->authenticate($_get['code']); $_session['token'] = $client->getaccesstoken(); $array = get_object_vars(json_decode($resp)); // store , use $refreshtoken new access tokens $refreshtoken = $array['refreshtoken']; }
Comments
Post a Comment