【问题标题】:Need help passing session using header redirect需要帮助使用标头重定向传递会话
【发布时间】:2017-06-15 10:37:31
【问题描述】:

我正在尝试为我喜欢的需要 oauth 的游戏(EVE Online)创建第 3 方应用程序。 我决定在它自己的脚本中进行 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> ]

正如您从评论部分看到的那样,我已经尝试了所有我能想到的诊断打印输出。那么,我哪里错了?

【问题讨论】:

  • 通过$_GET传递会话ID的任何特殊原因?
  • 我试过有没有。通过 $_GET 传递只是回答问题的又一机会。

标签: php arrays session oauth associative-array


【解决方案1】:

解决了 - 根据我在发布此问题后才发现的相关问题:

来自here

PHP 会话存储机制最初是围绕“注册”变量构建的,因此 $_SESSION 中的键必须是本身可以被视为变量的名称。这意味着 $_SESSION[10] 是无效的,因为 $10 不是一个有效的变量名,而且由于 $foo[10] 和 $foo['10'] 指的是同一个东西,$_SESSION['10']也是无效的。

CharacterID 是 int 的 string 版本之一,显然 PHP 会话不喜欢其数组键中的数字...

【讨论】:

  • $10 确实是不允许的
猜你喜欢
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多