2016-06-23 12 views
0

Так что я пытаюсь сохранить сессию живой, в тот момент, когда я обновить сессии истекает дает мне это:OAuth2, маркер открытого ключа не держит сессию

Received error: 400 Raw response:{"error":"SESSION_EXPIRED","error_description":"Session expired"}

Вот мой код, основанный на примере, приведенном на Yahoo, Gemini's documentation, который я прочитал, но ничего не прекращается, когда заканчиваются сеансы.

<?php 
/* Example code to access Gemini API: Fetch advertiser information, create a new campaign and read specific campaign data 

Prerequisites: 
    1. Sign up for an account on https://admanager.yahoo.com 
    2. Download YahooOAuth2.class.php file from here: https://github.com/saurabhsahni/php-yahoo-oauth2/blob/master/YahooOAuth2.class.php 
    3. PHP modules for json_decode & curl 
    4. A webserver running this code on port 80/443. Yahoo OAuth callback is only supported on these ports 
*/ 
require "YahooOAuth2.class.php"; 
session_start(); 
#Your Yahoo API consumer key & secret with access to Gemini data 

define("CONSUMER_KEY","<your consumer key>"); 
define("CONSUMER_SECRET","<your consumer secret>"); 
$redirect_uri="http://".$_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'];//Or your other redirect URL - must match the callback domain 

$gemini_api_endpoint="https://api.admanager.yahoo.com/v1/rest"; 

$oauth2client=new YahooOAuth2(); 

if (isset($_GET['code'])){ 
    $code=$_GET['code']; 
    $_SESSION['code'] = $_GET['code']; 
} 
else { 
    $code=0; 
} 

if($code){ 
    #oAuth 3-legged authorization is successful, fetch access token 
    $_SESSION['token'] = $oauth2client->get_access_token(CONSUMER_KEY,CONSUMER_SECRET,$redirect_uri,$_SESSION['code']); 

    #Access token is available. Do API calls. 

    $headers = array('Authorization: Bearer '. $_SESSION['token'],'Accept: application/json','Content-Type: application/json'); 

    #Fetch Advertiser Name and Advertiser ID 
    $url=$gemini_api_endpoint."/advertiser/"; 

    $resp=$oauth2client->fetch($url,$postdata="",$auth="",$headers); 
    $jsonResponse = json_decode($resp); 
    $advertiserName = $jsonResponse->response[0]->advertiserName; 
    $advertiserId = $jsonResponse->response[0]->id; 
    echo "Welcome ".$advertiserName; 
} 
else { 
    # no valid access token available, go to authorization server 
    header("HTTP/1.1 302 Found"); 
    header("Location: " . $oauth2client->getAuthorizationURL(CONSUMER_KEY,$redirect_uri)); 
    exit; 
} 

?> 

Как вы можете видеть, что я пробовал session_start() ;, экономии $ _GET [ 'код'] и $ _GET [ 'маркер'] в сессии, но это не работает.

Я прав, что это проблема с сохранением токена? Я потратил на это день и чувствую, что собираюсь по кругу.

ответ

0

Для меня работает следующий код. Дайте мне знать, если это вообще поможет.

Для первого запроса, попробуйте следующее:

require "YahooOAuth2.class.php"; 

#Your Yahoo API consumer key & secret with access to Gemini data 
define("CONSUMER_KEY",""); 
define("CONSUMER_SECRET",""); 
$redirect_uri="http://".$_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'];//Or your other redirect URL - must match the callback domain 

$gemini_api_endpoint="https://api.admanager.yahoo.com/v1/rest"; 
$oauth2client=new YahooOAuth2(); 

if (isset($_GET['code'])){ 
$code=$_GET['code']; 
} 
else { 
$code=0; 
} 

if($code){ 
#oAuth 3-legged authorization is successful, fetch access token 
$tokens=$oauth2client->get_access_token(CONSUMER_KEY,CONSUMER_SECRET,$redirect_uri,$code); 

#Access token is available. Do API calls. 
$headers= array('Authorization: Bearer '.$tokens['a'],'Accept: application/json','Content-Type: application/json'); 
#Fetch Advertiser Name and Advertiser ID 
$url=$gemini_api_endpoint."/reports/custom"; 
$resp=$oauth2client->fetch($url,$postdata=$json,$auth="",$headers); 
$jsonResponse = json_decode($resp); 
} 

else { 
# no valid access token available, go to authorization server 
header("HTTP/1.1 302 Found"); 
header("Location: " . $oauth2client->getAuthorizationURL(CONSUMER_KEY,$redirect_uri)); 
exit; 
} 

Тогда для следующего запроса (который можно использовать повторно через петлю, если желательно):

$refreshThis = $tokens['r']; 

$gemini_api_endpoint="https://api.admanager.yahoo.com/v1/rest"; 
$oauth2client=new YahooOAuth2(); 


if($code){ 
#oAuth 3-legged authorization is successful, fetch access token 
$tokens=$oauth2client->get_new_access_token(CONSUMER_KEY,CONSUMER_SECRET,$redirect_uri,$refreshThis); 

#Access token is available. Do API calls. 
$headers= array('Authorization: Bearer '.$tokens['a'],'Accept: application/json','Content-Type: application/json'); 
#Fetch Advertiser Name and Advertiser ID 
// $url=$gemini_api_endpoint."/campaign/347026014"; 
$url=$gemini_api_endpoint."/reports/custom"; 
$resp=$oauth2client->fetch($url,$postdata=$json,$auth="",$headers); 
$jsonResponse = json_decode($resp); 
// $advertiserName = $jsonResponse->response[0]->advertiserName; 
// $advertiserId = $jsonResponse->response[0]->id; 
// echo "Welcome ".$advertiserName; 
} 
else { 
# no valid access token available, go to authorization server 
header("HTTP/1.1 302 Found"); 
header("Location: " . $oauth2client->getAuthorizationURL(CONSUMER_KEY,$redirect_uri)); 
exit; 
} 

От YahooOAuth2.class.php файл:

public function get_new_access_token($clientId, $clientSecret,$redirect_uri,$refreshThis) { 
    $url=self::TOKEN_ENDPOINT; 

    $postdata=array("redirect_uri"=>$redirect_uri,"refresh_token"=>$refreshThis,"grant_type"=>"refresh_token"); 
$auth=$clientId . ":" . $clientSecret; 
    $response=self::fetch($url,$postdata,$auth); 
// Convert the result from JSON format to a PHP array 
$jsonResponse = json_decode($response); 

$token['a'] = $jsonResponse->access_token; 
$token['r'] = $jsonResponse->refresh_token; 

var_dump($token['a']); 
var_dump($token['r']); 

    return $token; 

} 
+0

Спасибо, например, я проверил его – user1955643

 Смежные вопросы

  • Нет связанных вопросов^_^