2013-04-06 2 views
2

ajax를 사용하여 로그인 시스템을 설정하려고합니다.Ajax 로그인을 RESTful 서버로 만들 수 없습니다.

사용자가 자신의 로그인과 비밀번호를 subdomain.domain.com (otherdomain.com 일 수도 있음)에 삽입 한 후 rest.domain.com에 Jquery $. post 요청을하고 사용자가 올바르게 로그인하게됩니다.

그런 다음 rest.domain.com에 다시 요청하여 사용자가 기록되었는지 (또는 사용자가 로그인해야하는 다른 작업을 수행하는지 확인) 세션이 비어 있습니다.

내가 뭘 잘못하고 있니?

편집

클라이언트 응용 프로그램 (슬림 UFLEX를 사용하여)

$.post('http://rest.domain.com/user/login',form,function(data){ 
    //Do what is needed 
}); 

편안하고 응용 프로그램

header('Access-Control-Allow-Origin: *'); 
session_start(); 

//User 
//Check if logged 
$app->get('/user/logged', function() use ($user, $app){ 
    print_r($_SESSION); 
    echo $user->signed; 
}); 

//Login 
$app->post('/user/login', function() use ($user, $app) { 
    $username = isset($_POST['email']) ? $_POST['email'] : false; 
    $password = isset($_POST['password']) ? $_POST['password'] : false; 
    $auto = isset($_POST['auto']) ? $_POST['auto'] : false; 

    $user->login($username,$password,$auto); 

    if($user->signed){ 
     print_r($_SESSION); 
    }else{ 
     //Display Errors 
     foreach($user->error() as $err){ 
      echo "<b>Error:</b> {$err} <br/ >"; 
     } 
    } 
}); 
+0

동일한 웹 앱입니까? 어떤 서버를 사용하고 있습니까? 웹 API? servicestack? –

+0

세션을 어떻게 처리하는지 더 자세히 설명해 줄 수 있습니까? $ _Session []을 사용하거나 데이터베이스에 저장하고 있습니까? – CodePorter

+0

@ 엘거 - 사실 두 개의 웹 앱이 있습니다. 서버와 클라이언트. 또한 표준 Linux 공유 환경에 설정되어 있습니다. – Robyflc

답변

0

크로스 도메인 아약스 요청을하는 것이 가능하지만 보안상의 이유로 이러한 요청은 유효한 세션을 유지하는 데 필요한 쿠키를 설정하지 않습니다.

내 경우에는 소프트웨어 설계를 통해 모든 상호 도메인 요청을 제거하고 작동하도록 대체 할 수있었습니다.

그렇지 않은 경우 가장 좋은 해결책은 '심각한'RESTful API의 대부분이 OAuth에 의존하는 것이라고 생각합니다.

2

난 당신이 같은 기원 정책을 위반하고 생각합니다. Ajax 요청을 다른 도메인으로 만들 수 없으며, 적어도 SOP에서 규정 한 사항입니다. 그래서 그것은 여러분이보아야 할 것입니다.

위의 절차를 수행 한 후 브라우저를 사용하여 저장된 쿠키를 검사하십시오. 쿠키는 하위 도메인 단위로 저장되므로 PHP_SESSID 쿠키 (사용하는 경우 $_SESSION)가 잘못된 하위 도메인에 존재할 수 있습니다.

세션을 저장하는 방법에 대해 더 많은 통찰력을 제공 할 수 있습니까?

위와 상관없이 모든 Ajax 요청을 동일한 하위 도메인, 프로토콜 등의 동일한 대상 ajax.php 파일 (모든 SOP 규칙)에 지정하고 서버 수준에서 요청을 라우팅하는 것이 가장 좋습니다.

+0

CORS를 사용하여 위반하지 않고 RESTful 서버를 만들 수 없음을 확인합니다. 이상하게도 세션 쿠키가 저장되지 않습니다. 서버는이를 uFlex 클래스를 사용하여 세션에 저장합니다. – Robyflc

+0

웹 서버의 헤더 허용 시작 정책을 설정하여 이러한 상호 도메인 요청을 허용 할 수 있습니다. –

+0

이 문제가 발생하기 전에 많이 했으므로 문제는 관련이 없습니다. – Robyflc

0

세션이 rest.domain.com에 바인딩 된 쿠키에 저장되어있을 가능성이 있습니다.

이 스레드를 참조하십시오 : 는 이러한 종류의 인증을 지원하기 위해 Why is jquery's .ajax() method not sending my session cookie?

, 당신이 중 하나를 모두 REST API와 동일한 도메인의 웹 사이트를하거나 (즉, 헤더를 기반으로 세션 인증을 정의 당신은 클라이언트와 서버간에 교환 할 수 있습니다.

예를 들어 초기 인증을 수행 한 후 임의의 session-id (PHP 세션 ID 아님)와 next-request-id를 생성하여 HTTP 헤더를 통해 클라이언트에 다시 보낼 수 있습니다.

클라이언트 측에서 session-id 및 next-request-id를 읽고 후속 REST API 요청에 사용합니다.

REST API는 session-id 및 next-request-id를 확인하고 유효성을 검사합니다. 유효한 경우 요청이 인증됩니다. 응답에서 동일한 session-id와 새로운 next-request-id가 클라이언트로 다시 전송됩니다.

타사가 세션을 변경하지 못하게하려면 request-id가 두 번 사용되면 session-id를 무효화해야합니다.

페이지 변경 전체에서 세션 ID를 재사용하려면 두 브라우저를 모두 localStorage 브라우저에 저장할 수 있습니다.

+0

나는 그것을 볼 것이다! – Robyflc

관련 문제