브라우저: Firefox 83.0 (64비트)
이 포럼에서 찾은 PHP 스크립트를 사용하면 Chrome에서는 SSO가 정상적으로 작동하지만, Firefox에서는 &sig 앞에 == 기호가 추가됩니다. 원인을 아시는 분 계신가요?
session/sso_provider?sso=bm9uY2U9MmE4YmE2NmE0ZmRmYjRlM2JmNGJmMDkzNTliZjg3MWVlZDhkMTIzNTRiMzc4OGQyNTAwYzY3NjBiZjEwNWMyNmYzMTUxNmE4NTc0NDdjNzE0YmRkYTM4MTljMmFjOTA5NmY0MDkyNWQ5NWIwOTFkMDVmM2QzZDIyZDhmYTdiMzYmcmV0dXJuX3Nzb191cmw9aHR0cHMlM0ElMkYlMkZ2Y2VsaXF1aWRyZWNpcGVzLmNvbSUyRmNvbnRyb2xsZXJzJTJGbG9naW5Db250cm9sLnBocA==&sig=261ee2477e94edcbcc1513e248091860445ed2c2cc8f30835a1fd061ff0
simon
12월 9, 2020, 4:50오후
2
사용 중인 PHP 스크립트의 링크를 공유해 주실 수 있나요?
michaeld
(Michael - Communiteq)
12월 9, 2020, 5:11오후
3
그것은 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> <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();
michaeld
(Michael - Communiteq)
12월 9, 2020, 7:35오후
5
네, 모두 괜찮아 보입니다. 그런데 이게 어떻게 문제가 되는 건가요? 제 생각에는 그래도 작동할 것 같은데..
잘 물어보셨네요. 로그인 자체는 정상적으로 되는데, 사이트로 돌아오면 사용자 메뉴가 표시되지 않고 User 내비게이션 링크 아래에 다시 로그인 버튼만 표시됩니다.
쿠키 관련 문제인 것 같다는 생각이 들기 시작했어요. 크롬에서는 정상적으로 작동하는데, 거의 초기 페이지 로드 시 “로그인됨” 확인이 무시되는 것처럼 보입니다. 새로고침을 하면 로그인된 사용자의 모든 내비게이션 항목이 정상적으로 표시되죠. 다만 이 문제는 파이어폭스에서만 발생한다는 점을 강조하고 싶습니다.
michaeld
(Michael - Communiteq)
12월 9, 2020, 7:42오후
7
음, 정말 이상하군요.
하지만 ==가 URL 인코딩으로 표시되지 않는 것과 무관할 것 같습니다. 따라서 지금 잘못된 방향으로 접근하고 있을 수 있습니다.
수정될 때까지 계속 시도해 볼게요. 해결되면 바로 알려드릴게요. 도움 주셔서 감사합니다