Extra Form
PHP PHP 7.3
CMS Rhymix 2.0

안녕하세요.

 

A (php로 만들어진 사이트)
B( 라이믹스 2.0.13) 

 

 

A 라는 사이트에서 아이디를 보내주면

 

B라는 라이믹스 사이트에서서 해당 아이디가 있으면 로그인처리 하려고 하고 없으면 회원가입 시킬려고 합니다. (패스워드 등은 알아서 처리 예정)

 

A 사이트에서 데이터를 받을때

if($_SERVER['REQUEST_METHOD'] === 'POST') {
    require_once ($_SERVER['DOCUMENT_ROOT'] . "/common/autoload.php");
    Context::init();

    $data = json_decode(file_get_contents('php://input'), true);

    $member_info = getModel('member')->getMemberInfoByUserID($data['user_id']);



...

 

이렇게 auth.php 파일을 만들어서 받고 

($data 변수에 넘긴 값이 잘 들어오는듯합니다.)

 

그런데 getMemberInfoByUserID() 여기도 해당 $member_info로 잘 가져오는데

 

getMemberInfoByUserID, procMemberLogin() 등에서 debugPrint(); 를 하거나 로그인 처리를 하려고 해도 작동하지 않네요.

 

원래 $_SERVER['REQUEST_METHOD'] 안에선 잘 안되는것이었나요?? 

 

혹은 다른 방법이 무엇이 있을까요? 

 

 

 

  • profile

    제일 중요한 정보가 빠졌네요. 저 auth.php를 어디에서 어떤 방식으로 호출하나요?

     

    만약 A사이트의 서버에서 curl이나 그 밖의 PHP 라이브러리로 B사이트의 auth.php를 호출한다면, 로그인 처리하더라도 curl이 로그인되는 것이지 사용자의 브라우저가 로그인되는 것이 아니기 때문에 아무 소용 없습니다. 디버그 함수를 사용하더라도 그 디버그 정보를 curl이 받지, 사용자가 받지는 않겠죠.

     

    만약 A사이트에서 자바스크립트(AJAX 또는 location.href)로 B사이트의 auth.php를 호출한다면, POST가 아닌 GET으로 요청되어서 첫 번째 줄의 조건을 통과하지 못하고 있을 가능성이 높습니다. CORS나 <form> 같은 꼼수를 동원하지 않는 한, 자바스크립트는 다른 사이트에 POST 요청을 발생시킬 수 없는 것이 원칙이니까요. 위에 언급한 꼼수를 동원하더라도 CSRF 체크에 걸려서 튕길 가능성이 높고요. 혹시라도 성공하신다면 알려주세요. 다음 버전에서 해당 꼼수를 차단하겠습니다.^^

  • profile ?
    잘 읽어보았습니다. 아마 안되리라 생각은 되지만 몇몇 뻘짓좀 해보고 말씀드리겠습니다.

    A사이트에서 단순 user_id를 받아서 B(라이믹스) 에서 있다면 자체 로그인만 성공하면되는 부분인데

    어떻게 처리하는게 가장 라이믹스 다울까요?
  • ? profile

    서로 다른 사이트간에 연동할 때는 POST보다는 GET으로 하셔야 합니다.
    auth.php?user_id=aaaaa&key=bbbbb 로 일단 넘겼다가, 로그인 처리 후 메인화면으로 다시 넘기는 거죠.

    물론 아무 아이디나 대입하면 다 로그인이 되어 버릴 테니, auth.php에서 curl로 A사이트를 다시 호출하여, 지금 이 사람한테 이 key를 줘서 나한테 보낸 거 맞음? 이라고 확인받는 과정을 넣어야겠지요. 서로 다른 사이트간의 로그인 연동은 반드시 다음의 3가지 요소가 들어가야 합니다. 1) 사용자를 리다이렉트시키기 2) 서버끼리 API 호출 3) 다른 사람이 예측할 수 없는 랜덤 키를 사용한 검증. 이 중 하나라도 빠지면 해킹당해요.

  • profile ?
    그렇다면 auth.php 에서 GET으로 넘겨받은 아이디가 정상적이고 DB에도 있다고 한다면
    로그인 시키는 방법중에

    $member_info = getModel('member')->getMemberInfoByUserID($_GET['user_id']);
    Rhymix\Framework\Session::login($member_info->member_srl);
    getController('member')->setSessionInfo();

    이러한 방법은 어떤가요? 다른 로그인 방법을 찾아봐야 할까요?
  • ? profile
    라이믹스/XE에서는 $_GET['user_id'] 사용하지 않습니다. Context::get('user_id')입니다.
    Session::login() 하고 나서 반드시 다른 화면으로 리다이렉트시킨 후에
    정상적으로 로그인되었는지 확인하시면 됩니다.
    곧바로 리다이렉트한다면 setSessionInfo()는 필요하지 않습니다.
  • profile ?
    마지막으로 로그인은 그렇게 처리를 했지만

    회원가입은 조금 막막하네요. insertMember()를 다이렉트로 사용하지 못하고
    그렇데가 procMemberInsert()도 사용하지 못하네요.
  • ? profile
    변수만 잘 맞춰주면 insertMember()를 다이렉트로 호출할 수 있습니다.
    물론 보안상 신경써야 할 것도 그만큼 더 많아지겠지요.
  • profile

    A 사이트에서 임의로 B 사이트 로그인 상태를 수정할 수 없습니다. 임의로 건드릴 수 있다면 심각한 취약점이니 수정되어야 합니다.

    A사이트에서 B사이트 상태를 변경하지 마시고 B사이트에서 A사이트에 요청을 보내 정보를 검증후 로그인처리하는것이 올바른 구현 방법입니다.

    예를 들면 A사이트가 로그인 기능이 있다면 로그인시 아이디 비번을 B사이트 서버가 A사이트로 보내 로그인 정보가 맞는지 체크후 강제로 가입 및(첫 로그인이라면 B사이트엔 해당 회원 정보가 없으니 받아와야겠죠? 이것은 A사이트가 할 일입니다) 로그인 처리하면 됩니다.

     

    이외 회원정보 동기화나 기타 정보를 받아오는것 역시 B사이트에서 A사이트로 요청을 보내야 합니다. 그 반대로 구현하는건 훨씬 힘들고 복잡합니다.

  • profile ?
    A사이트에는 user_id나 학년정보만 보냅니다. 단순한 형태에요
    B사이트(라이믹스) 에서 해당 아이디를 체크 한 후에 존재하면 로그인 등을 처리 하려고 합니다.
    그걸 저 예제처럼 처리 하려고 했는데 잘 안되는군요.

    더 나은 방법이 없을까요?