최신 Firefox가 SSO URL을 변경함

브라우저: Firefox 83.0 (64비트)

이 포럼에서 찾은 PHP 스크립트를 사용하면 Chrome에서는 SSO가 정상적으로 작동하지만, Firefox에서는 &sig 앞에 == 기호가 추가됩니다. 원인을 아시는 분 계신가요?

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

사용 중인 PHP 스크립트의 링크를 공유해 주실 수 있나요?

그것은 base64 인코딩된 문자열의 일부입니다. 클라이언트로 보내기 전에 urlencode()로 인코딩해야 합니다. 그렇게 하고 계신가요? 코드를 공유해 주시겠어요?

아래는 해당 코드이며, 미리 감사드립니다.

다음 링크를 수정했습니다: https://gist.github.com/paxmanchris/e93018a3e93018a3e8fbdfced039
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']);

로그인 함수:

*쿠키 설정 및 사용자 확인 등 기타 잡다한 작업 수행*

*다음으로 종료*
if(isset($_SESSION['url'])) 
	   $url = $_SESSION['url']; 
	else 
	   $url = ""; 
    $miscf = new miscf();
	$fullurl = $miscf->fullURL().$url;
	header("Location:".$fullurl); 
	unset($_SESSION['url']);
    die();

네, 모두 괜찮아 보입니다. 그런데 이게 어떻게 문제가 되는 건가요? 제 생각에는 그래도 작동할 것 같은데..

잘 물어보셨네요. 로그인 자체는 정상적으로 되는데, 사이트로 돌아오면 사용자 메뉴가 표시되지 않고 User 내비게이션 링크 아래에 다시 로그인 버튼만 표시됩니다.

쿠키 관련 문제인 것 같다는 생각이 들기 시작했어요. 크롬에서는 정상적으로 작동하는데, 거의 초기 페이지 로드 시 “로그인됨” 확인이 무시되는 것처럼 보입니다. 새로고침을 하면 로그인된 사용자의 모든 내비게이션 항목이 정상적으로 표시되죠. 다만 이 문제는 파이어폭스에서만 발생한다는 점을 강조하고 싶습니다.

음, 정말 이상하군요.

하지만 ==가 URL 인코딩으로 표시되지 않는 것과 무관할 것 같습니다. 따라서 지금 잘못된 방향으로 접근하고 있을 수 있습니다.

수정될 때까지 계속 시도해 볼게요. 해결되면 바로 알려드릴게요. 도움 주셔서 감사합니다 :smile: