2017-06-15 40 views
0

我想创建一个我喜欢的游戏(EVE Online)需要oauth的第三方应用程序。 我已经决定在它自己的脚本中进行oauth处理,并且一旦解决,就会根据从oauth中检索到的CharacterID将一个关联数组放入会话中。需要帮助通过会话使用标题重定向

我能够成功地从脚本末尾处理oauth请求的/callback/index.php'中输出会话数组的所需内容。但是,我希望将此脚本保留在“后台”并且有点秘密,并将大部分活动重定向到下面目录中的“../main.php”。

但是,当我最终到达main.php时,打印会话返回一个空数组。我究竟做错了什么?我一整天都在搜索解决方案,并且已经实现了其中的每一个。

下面是相关文件:

session.php文件

<?php 
    if (!empty($_GET['ID'])) { 
     session_id($_GET['ID']); 
    } 
    if (session_status() == PHP_SESSION_NONE) { 
     session_start(); 
    } else { 
     $sLocation="http://eve.oriigen.com/eClt"; 
     header("Location: ".$sLocation); 
     exit(); 
    } 

?> 

/callback/index.php

<?php require_once '../src/session.php' ?> 
<?php require_once 'secret.php' ?> 
<?php 

    function auth_error($error_message) 
    { 
     print "There's been an error"; 
     error_log($error_message); 
     exit(); 
    } 

    $sUserAgent = "EVE Contact List Toolkit [eClt]"; 

    $post_url = "https://login.eveonline.com/oauth/token"; 
    $get_url = "https://login.eveonline.com/oauth/verify"; 

    $client_id="Basic ".base64_encode($sClientId.":".$sSecretKey); 
    $content_type = "application/x-www-form-urlencoded"; 
    $host_url = "login.eveonline.com"; 

    $aHeaders = array("Authorization: ".$client_id, 
        "Content-type: ".$content_type, 
        "Host: ".$host_url); 

    $aPostFields = array("grant_type"=>"authorization_code", 
         "code"=>$_GET["code"]); 


    $oCurlRequest = curl_init(); 
    curl_setopt($oCurlRequest, CURLOPT_URL, $post_url); 
    curl_setopt($oCurlRequest, CURLOPT_USERAGENT, $sUserAgent); 
    curl_setopt($oCurlRequest, CURLOPT_HTTPHEADER, $aHeaders); 
    curl_setopt($oCurlRequest, CURLOPT_POST, count($aPostFields)); 
    curl_setopt($oCurlRequest, CURLOPT_POSTFIELDS, http_build_query($aPostFields)); 
    curl_setopt($oCurlRequest, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($oCurlRequest, CURLOPT_SSL_VERIFYPEER, true); 
    curl_setopt($oCurlRequest, CURLOPT_SSL_VERIFYHOST, 2); 
    $oResult = curl_exec($oCurlRequest); 

    if ($oResult===false) { 
     auth_error(curl_error($oCurlRequest)); 
    } 

    curl_close($oCurlRequest); 

    $aResponse=json_decode($oResult); 
    unset($oCurlRequest); 
    unset($oResult); 


    $sTokenType=$aResponse->token_type; 
    $sAuthToken=$aResponse->access_token; 
    $iAuthTokenExpire=$aResponse->expires_in; 
    $sRefreshToken=$aResponse->refresh_token; 

    $sGetHeader="Authorization: ".$sTokenType." ".$sAuthToken; 
    $oCurlRequest = curl_init(); 
    curl_setopt($oCurlRequest, CURLOPT_URL, $get_url); 
    curl_setopt($oCurlRequest, CURLOPT_USERAGENT, $sUserAgent); 
    curl_setopt($oCurlRequest, CURLOPT_HTTPHEADER, array($sGetHeader)); 
    curl_setopt($oCurlRequest, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($oCurlRequest, CURLOPT_SSL_VERIFYPEER, true); 
    curl_setopt($oCurlRequest, CURLOPT_SSL_VERIFYHOST, 2); 
    $oResult = curl_exec($oCurlRequest); 

    if ($oResult===false) { 
     auth_error(curl_error($oCurlRequest)); 
    } 
    curl_close($oCurlRequest); 
    $aResponse=json_decode($oResult); 
    unset($oCurlRequest); 
    unset($oResult); 

    $sCharId=(string)$aResponse->CharacterID; 
    $sCharacterName=$aResponse->CharacterName; 
    $sExpiresOn=$aResponse->ExpiresOn; 
    $sTokenType=$aResponse->TokenType; 
    $sCharacterOwnerHash=$aResponse->CharacterOwnerHash; 
    $sIntellectualProperty=$aResponse->IntellectualProperty; 

/* $aCharInfo=array("CharID"=>(int)$sCharId, 
        "CharName"=>$sCharacterName, 
        "CharOwnerHash"=>$sCharacterOwnerHash, 
        "ExpiresOn"=>$sExpiresOn, 
        "AuthToken"=>$sAuthToken, 
        "AuthTokenExpIn"=>$iAuthTokenExpire, 
        "RefreshToken"=>$sRefreshToken);*/ 

    if (!isset($_SESSION[(string)$sCharId])) { 
     $_SESSION[(string)$sCharId]=array("CharID"=>(int)$sCharId, 
        "CharName"=>$sCharacterName, 
        "CharOwnerHash"=>$sCharacterOwnerHash, 
        "ExpiresOn"=>$sExpiresOn, 
        "AuthToken"=>$sAuthToken, 
        "AuthTokenExpIn"=>$iAuthTokenExpire, 
        "RefreshToken"=>$sRefreshToken); 
    } else { 
     $_SESSION["moo"]=0; 
    } 

    session_write_close(); 
    $sRedirect="../main.php?ID=".session_id(); 
    header("Location: ".$sRedirect); 
    exit(); 

/* echo "<pre>"; 
    print_r($_SESSION); 
    echo "</pre>"; 
    echo "<hr />"; 
    echo gettype($iCharId); 
    echo "<hr />"; 
    echo "<pre>"; 
    print_r($aCharInfo); 
    echo "</pre>";*/ 
?> 

../main.php

<?php require_once './src/session.php' ?> 
<?php 
    //echo "SessionId: ".session_id()."<br />"; 
    //echo "<hr/>"; 
    //echo "<pre>"; 
    print_r($_SESSION); 
    //echo "</pre>"; 
?> 
[ <a href="logout.php">Logout</a> ] 

正如您从评论部分可以看到的,我尝试了每个我能想到的诊断打印输出。那么,我在哪里出错?

+0

有什么特别的原因,通过'$ _GET'传递一个会话ID ? – mazedlx

+0

我尝试过与没有。通过$ _GET传递只是解决问题的另一个答案。 – EchoBinary

回答

1

解决它 - 每一个相关的问题,我只张贴这个问题后发现:

here

PHP会话存储机制始建围绕“注册”的变量,所以在按键$ _SESSION必须是可以作为变量单独处理的名称。这意味着$ _SESSION [10]是无效的,因为$ 10不会是一个有效的变量名,并且由于$ foo [10]和$ foo ['10']引用相同的东西,$ _SESSION ['10']也是无效的。

或CharacterId要么和INT的一个int的字符串版本,显然PHP会话不会在他们的阵列按键喜欢数字...

+0

'$ 10'确实是不允许的 – mazedlx