2016-06-23 8 views
0

So versuche ich die Sitzung am Leben zu halten, in dem Moment, als ich die Sitzung aktualisieren abläuft mir geben diese:OAuth2, Token Schlüssel zu halten Sitzung nicht

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

Hier ist mein Code basierend auf dem Beispiel auf Yahoo gegeben Geminis documentation, die ich gelesen habe, aber es gibt nichts, um die Sitzungen ablaufen zu lassen.

<?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; 
} 

?> 

Wie Sie sehen Ich habe versucht, session_start() ;, Speichern $ _GET [ 'Code'] und $ _GET [ 'token'] in die Sitzung, aber das funktioniert nicht.

Habe ich Recht, dass ein Problem mit dem Speichern des Tokens ist? Ich habe einen Tag damit verbracht und fühle mich, als würde ich im Kreis herumlaufen.

Antwort

0

Der folgende Code funktioniert für mich. Lassen Sie mich wissen, ob das überhaupt hilft.

Für die erste Abfrage, versuchen Sie dies:

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; 
} 

dann für die nächste Abfrage (die Sie durch eine Schleife wiederverwenden können, wenn gewünscht):

$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; 
} 

Vom YahooOAuth2.class.php Datei:

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

Danke für das Beispiel, ich werde es testen – user1955643

Verwandte Themen