2013-06-25 3 views
8

모든 페이지에 대한 로그인 정보가 필요한 시스템을 구축 중입니다. 이 응용 프로그램은 codeigniter를 Phil Sturgeon 라이브러리로 사용하여 편안한 응용 프로그램으로 설계되었습니다. 이 라이브러리는 API 키를 사용하여 HTTPS 연결을 통해 모든 요청과 함께 API 호출을 전송함으로써 API 호출을 승인합니다.REST API 로그인 접근 방식

양방향 인증 또는 API 키만 사용하는 경우에도 마찬가지입니다.

  • 사용자 요청 처음으로 (예 : https://www.xyz.com)에 대한 응용 프로그램 : 다음은 usernam를 입력 자격 증명을
  • 사용자를 확인하기 위해 로그인 페이지로 리디렉션됩니다 무엇 내가 잠시 동안 검색하고하면 다음과 같은 시나리오

    • API 키는 식별되는 자원으로 클라이언트에 서버가 제공되어야한다 : 정보가 다음 유효한 경우/암호와 HTTPS를 통해 POST를 통해

    • 서버 검사를 보냈 이 사용자 이름 (여기에 질문 ??? ???)

    • 안전하게 API 키를 클라이언트에 보내는 방법은 무엇입니까?

      • 1) 난 후이 나머지의 상태 비 폭력과 내가 확실하지 않습니다 (모든 들어오는 요청이 API 키를 사용하여 세션 쿠키를 사용하여 쿠키에 API 키를 복원 할 수 그것은 충분히 안전하다).
      • 2)
      • 사실 나는 다른 옵션을 모르는 : 당신은 예를 줄 수있는 경우

를 도울 수가 나는 등 큰 도움이 될 것이다 경우는 네 차례 야 연결이 이론적으로 (HTTPS, 당신은 와이어를 통해 보내 아무것도 안전이기 때문에 기사

:

+0

또한 Api 키를 사용하는 접근 방식을 사용자 인증에만 사용하면 응용 프로그램 내부의 데이터가 민감하기 때문에 보안이 걱정됩니다. – ahmedsaber111

답변

8

의 발견 및 읽기 많은 당신을 제공 mitm '이 아님). 전체 API가 HTTPS를 통해 제공되는지 (사용자가 지정하지 않음) 확실하지 않으므로 로그인의 일부로 키를 반환 할 수 있지만 (여전히 HTTPS의 우산 아래에 있음), API의 나머지가 아닌 경우 HTTPS에서 키는 다음 요청시 스니핑 될 수 있습니다.

세션 및 쿠키는 일반적으로 RESTful 응용 프로그램의 일부가 아닙니다. REST는 상태 비 저장입니다.

HTTPS가 아닌 경우에도 회전 키와 같은 것이 더 좋을 것입니다. HTTPS를 통해 로그인하면 서버가 api 키를 반환하고 다음 요청에서 서버를 사용하고 서버는 새 API 키를 반환하며 다음 요청시이를 사용합니다. HTTPS가 아닌 단일 API 키보다 낫지 만 완벽하지는 않습니다. 누군가가 후속 요청 중 하나의 응답을 스니핑하고 그 키를 소비하지 않으면 그 응답을 사용할 수 있습니다. 이렇게하면 클라이언트에서 서버로의 요청이 스니핑되면 공격 키가 비 HTTPS 응답으로 축소되어 합법적 인 요청에 의해 이미 api 키가 사용됩니다. 그러나 HTTPS를 통해 API를 제공하지 않는 경우 API를 보호하기 위해 더 많은 작업을 수행해야합니다.

내가 본인이라면 + https 서명 요청을 살펴볼 것입니다.요청 서명의 일부 이야기는 여기있다 : https://stackoverflow.com/a/8567909/183254

는 또한 클라이언트의 API를 http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/

의사 코드 예제 JS 기능의 부분을 고정 에서 인증 다이제스트에 대한 몇 가지 정보를 원하시면있다

function get_calendar(){ 
    var key = $('#api_key').value(); 
    $.ajax({ 
     type: 'get', 
     url: '/index.php/api/calendar?key=' + key, 
     success: function(response){ 
      // show calendar 
      // ... 
      // set received api key in hidden field with id api_key 
      $('#api_key').value(response.api_key) 
     } 
    }) 
} 

컨트롤러 예 :

function calendar_get($api_key = ''){ 
    if($api_key_matches){//verify incoming api key 
     $r = array(); 
     $r['calendar'] = $this->some_model->get_calendar(); 
     $r['api_key'] = $this->_generate_api_key();// generate or get api key 
    } 
    $this->response($r); 
} 
+0

가장 큰 문제는 어떻게 API-KEY를 보낼 수 있습니까? 다음 요청에서이 API 키를 사용할 수 있도록 로그인 시도가 성공한 사용자 – ahmedsaber111

+0

캘린더 메소드를 사용하여 예제를 추가했습니다. 본질적으로 배열을 만들고 거기에 응답과 API 키를 던져'$ this-> response()'와 함께 반환하면된다. – stormdrain