最新版 Firefox 影响 SSO URL

浏览器:Firefox 83.0(64 位)

SSO 在使用本论坛提供的 PHP 脚本时,在 Chrome 中运行正常,但在 Firefox 中会在 &sig 前额外添加一个 ==。有人知道可能是什么原因吗?

session/sso_provider?sso=bm9uY2U9MmE4YmE2NmE0ZmRmYjRlM2JmNGJmMDkzNTliZjg3MWVlZDhkMTIzNTRiMzc4OGQyNTAwYzY3NjBiZjEwNWMyNmYzMTUxNmE4NTc0NDdjNzE0YmRkYTM4MTljMmFjOTA5NmY0MDkyNWQ5NWIwOTFkMDVmM2QzZDIyZDhmYTdiMzYmcmV0dXJuX3Nzb191cmw9aHR0cHMlM0ElMkYlMkZ2Y2VsaXF1aWRyZWNpcGVzLmNvbSUyRmNvbnRyb2xsZXJzJTJGbG9naW5Db250cm9sLnBocA==&sig=261ee2477e94edcbcc1513e248091860445ed2c2cc8f30835a1fd061ff0

你能分享一下你正在使用的 PHP 脚本的链接吗?

这只是 Base64 编码字符串的一部分。在发送给客户端之前,你应该先对其进行 urlencode()。你这样做了吗?能分享一下你的代码吗?

代码如下,提前感谢

我修改了此代码 Discourse sso provider login · GitHub
使用该代码的网站及在 Firefox 中出现问题的链接:https://vceliquidrecipes.com/

登录表单

<div class="row mt-1">
<div class="col-md-12 d-flex justify-content-center">
<p><a class="btn btn-success" href="'.$discourse_url.'/session/sso_provider?'.$query.'" role="button">登录</a>&nbsp;&nbsp;<a class="btn btn-success" href="https://vapingcommunity.co.uk/signup" role="button">注册</a></p>
</div>
</div>

$sso_secret = 'ITSASECRET';
$discourse_url = 'https://vapingcommunity.co.uk';

$nonce = hash('sha512', mt_rand());
$_SESSION['nonce'] = $nonce;

$payload =  base64_encode( http_build_query( array (
	'nonce' => $nonce,
	'return_sso_url' => $me
	)
) );

$request = array(
	'sso' => $payload,
	'sig' => hash_hmac('sha256', $payload, $sso_secret )
	);

$query = http_build_query($request);


if(!empty($_GET) and isset($_GET['sso'])){
	$sso_secret = 'ITSASECRET';
	if(isset($_SESSION['loggedin']) && isset($_SESSION['username']) && $_SESSION['loggedin'] == true){
		header("location: /");
		die();
	}
	
	$sso = $_GET['sso'];
	$sig = $_GET['sig'];

	if(hash_hmac('sha256', urldecode($sso), $sso_secret) !== $sig){
		header("HTTP/1.1 404 Not Found");
		die();
	}

在我的控制器中

$sso = urldecode($sso);
$query = array();
parse_str(base64_decode($sso), $query);

$username = $query['username'];
$useremail = $query['email'];
if(!empty($query['avatar_url'])) {
	$avatar_url = $query['avatar_url'];
}
else {
	$avatar_url = $miscf->fullURL().'/images/defaultAvatar.png';
}
$userisadmin = $query['admin'];
$userismoderator = $query['moderator'];
$usergroup = $query['groups'];
$externalid = $query['external_id'];
if ($userf->checkUserEIDExists($externalid) == false) {
	$userf->addUser($username,$useremail,$avatar_url,$userisadmin,$userismoderator,$usergroup,$externalid);
}


$nonce = $_SESSION['nonce'];
if($query['nonce'] != $nonce){
    header("HTTP/1.1 404 Not Found");
    die();
}

$userf->loginUser($query['username'],$query['external_id'],$avatar_url,$query['groups']);

登录函数:

*设置 Cookie 并执行其他杂项操作,如用户检查*

*最后以以下内容结束*
if(isset($_SESSION['url'])) 
	   $url = $_SESSION['url']; 
	else 
	   $url = ""; 
    $miscf = new miscf();
	$fullurl = $miscf->fullURL().$url;
	header("Location:".$fullurl); 
	unset($_SESSION['url']);
    die();

好的,看起来都没问题。那这怎么会引发问题呢?毕竟我认为它应该仍然可以正常工作。

好吧,很高兴你问到这个问题。看起来登录是成功的,但回到网站后,用户菜单并未显示,在“用户”导航链接下仍然只显示登录按钮。

我开始怀疑这是否与 Cookie 有关,因为在 Chrome 中一切正常。这几乎就像是“已登录”状态检查在初始页面加载时被忽略了,刷新页面后,所有已登录用户的导航项才会正常显示。需要强调的是,这个问题仅在 Firefox 中出现。

嗯,这确实很奇怪。

不过,我认为这与“==”未进行 URL 编码显示无关。因此,你可能走错了方向。

我会继续尝试直到修复它,并在完成后向您汇报,感谢您的帮助 :smile: