处理 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
}
我会说问题是您从未创建会话。这就是为什么 $_SESSION
是 null
.
的原因
所以我的管理方式是我总是创建一个会话
if(empty(session_id()) {
session_start()
}
(每次有人“访问”您的网站时都需要调用它。意思是,每个 .php
文件。最好的方法是将其放入 config.php
我正在尝试基于 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
}
我会说问题是您从未创建会话。这就是为什么 $_SESSION
是 null
.
所以我的管理方式是我总是创建一个会话
if(empty(session_id()) {
session_start()
}
(每次有人“访问”您的网站时都需要调用它。意思是,每个 .php
文件。最好的方法是将其放入 config.php