【问题标题】:OAuth2, token key not keeping sessionOAuth2,令牌密钥不保持会话
【发布时间】:2016-10-25 10:07:35
【问题描述】:

所以我正在尝试保持会话处于活动状态,在我刷新会话的那一刻过期给我这个:

收到错误:400 Raw 响应:{“错误”:“SESSION_EXPIRED”,“错误描述”:“会话 过期”}

这是我的代码,基于雅虎双子座 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['code'] 和 $_GET['token'] 保存到会话中,但这不起作用。

我是对的,这是保存令牌的问题吗?我在上面花了一天时间,感觉自己在绕圈子。

【问题讨论】:

    标签: php oauth-2.0 yahoo-api gemini


    【解决方案1】:

    以下代码对我有用。让我知道这是否有帮助。

    对于第一个查询,试试这个:

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

    【讨论】:

    • 谢谢你的例子,我会测试一下
    猜你喜欢
    • 2016-06-10
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2021-05-30
    相关资源
    最近更新 更多