处理 OAuth2 时 $_SESSION 中缺少变量

Missing variable in $_SESSION while dealing with OAuth2

我正在尝试基于 gitlab OAuth2 进行登录。

所以我找到了这个基于 league/oauth2-client 的 package,这个包似乎涵盖了我的所有需求。我在我的 gitlab 上正确配置了令牌并且它正确地登录了我,但是当我在登录后获得重定向时我得到了无效状态,这是由于缺少 $_SESSION['oauth2state']

所以工作流程是这样的:

转到localhost:XXXX --> 被重定向到 gitlab --> 登录 --> 重定向回 localhost:XXXX --> 获取无效状态,因为会话中缺少变量

我的代码基于 that

中的片段

我的PHP脚本

$provider = new Gitlab([
    'clientId'          => $application_id,
    'clientSecret'      => $secret,
    'redirectUri'       => $redirect_uri,
    'domain'            => $domain
]);

$options = [
    'state' => $unique_hash,
    'scope' => ['read_user','api']
];

if (!isset($_GET['code'])) {

    // If we don't have an authorization code then get one
    $authUrl = $provider->getAuthorizationUrl($options);
    $_SESSION['oauth2state'] = $provider->getState();
    ob_start(); // debug
    var_dump($_SESSION); // debug --> Here I have a variable
    error_log(ob_get_clean(), 4); // debug
    header('Location: '.$authUrl);
    exit;

// Check given state against previously stored one to mitigate CSRF attack
} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
    ob_start(); // debug
    var_dump($_SESSION); // debug --> Here I get null
    error_log(ob_get_clean(), 4); // debug
    unset($_SESSION['oauth2state']);
    exit('Invalid state');

} else {
     // rest of the code
}

我会说问题是您从未创建会话。这就是为什么 $_SESSIONnull.

的原因

所以我的管理方式是我总是创建一个会话

if(empty(session_id()) {
  session_start()
}

(每次有人“访问”您的网站时都需要调用它。意思是,每个 .php 文件。最好的方法是将其放入 config.php