2015-01-04 1 views
1

현재 응용 프로그램에서 API를 분리하기 위해 웹 응용 프로그램의 재구성을 계획 중입니다. 현재 사용자는 운영자 ID (사용자 이름)와 암호를 표준 HTML 양식에 입력하여 응용 프로그램에 로그인하고 데이터베이스 테이블을 확인하고 PHP 세션을 생성하여 인증을 수행합니다 (Zend_Session을 사용하여 처리). API를 분리 한 후에도이 작업을 계속하는 방법을 모르겠습니다.웹 응용 프로그램에서 API를 분리 할 때의 인증

// GET https://foo.example.com/module/trips.php 
if (isLoggedIn() && isAuthorized($SESSION->operatorID)) { 
    require 'views/trips.php'; 
} 

// POST https://foo.example.com/module/trips.php?action=take 
// ... 
// this request can come from AJAX, for example 
if (isLoggedIn() && isAuthorized($SESSION->operatorID)) { 
    $model->assignTrip($SESSION->operatorID, $_POST['trip_id']); 
} 

은 분명히이 따라서, 두 가지를 분리하는 노력이 매우 편안하고되지 않습니다 : 여기에

상황이 현재 작동하는 방법을 설명하기 위해 몇 가지 간단한 코드입니다. 이것이 내가 제안한 것입니다 (진행중인 작업 임).

// GET https://api.foo.example.com/v1.0/trips 
echo json_encode($model->getAllTrips()); 

// POST https://api.foo.example.com/v1.0/trips/:trip_id/operator 
$model->assignTrip($_POST['operator_id'], $trip_id); 

나는 REST가 무국적이라는 것을 알고 있습니다. 이 단순화 된 예에서는 운영자 만이 스스로 여행을 할당 할 수 있어야합니다. 이 API를 어떻게 적용합니까?

REST API 인증 관련 많은 질문과 기사를 읽었으며 OAuth/OAuth2에 대한 이야기는 모두 토큰을 통해 API의 클라이언트를 인증하는 데는 좋지만 API 클라이언트의 사용자를 인증하는 것은 아닙니다. 내 경우에는 API 클라이언트가 여전히 웹 응용 프로그램입니다.

내 주요 질문 : API는 사용자의 신원을 어떻게 결정합니까? 아니면 그럴까?

는 또한 내가 웹 응용 프로그램에서이 일을 생각했다 :

불필요한 오버 헤드하지만 that's what it looks like in this answer 것 같다
// POST https://foo.example.com/module/trips.php?action=take 
// ... 
// this request can come from AJAX, for example 
if (isLoggedIn() && isAuthorized($SESSION->operatorID)) { 
    // Use cURL to send an HTTP POST request with the appropriate data to 
    // https://api.foo.example.com/v1.0/trips/6/operator 
} 

. 내 구조 조정 후 내가 자바 스크립트에서이 같은 일을해야한다고 생각 :

$.ajax({ 
    type: 'POST', 
    url: 'https://api.foo.example.com/v1.0/trips/' + trip + '/operator', 
    data: { 
     operator_id: 6601 
    } 
}).success(function() { 
    // It worked! 
}); 

내가 예를 들어 GitHub API Authentication에서 검토 한 기본 사용법 curl -u "username" <api-endpoint-url>를 사용합니다. 이 애플리케이션은 이미 HTTPS로만 제공되기 때문에 Authorization HTTP 헤더 사용에 대해 걱정하지 않지만이 경우 로컬로 비밀번호 (예 : 웹 저장소 또는 기타)를 저장할 필요가 없습니까?

나는 또한 this blog post을 읽었으며 그게 내가하고있는 일인지 확신 할 수 없다. 그렇다면 해쉬 된 데이터에 사용자 이름과 암호를 포함시켜야 하는가?

아마도 API가 일반적으로 작동하는 방식을 오해하고 있습니다. 그렇다면 누군가가이를 해결하는 것이 좋을 것입니다.

답변

0

나는 약간의 헤더 데이터를 보내고 localy를 저장하는 것이 이상하다고 생각하지만, 그렇게 생각한다.

HMAC authentication을 살펴볼 수 있습니다.

오늘날 많은 API가이를 사용하거나 작동하도록 조정합니다. 헤더의 일부 사용자 ID를 해시와 연결하여 보내 게됩니다. 서버는 해당 독자가 사용자를 인식합니다.

localh 암호를 저장할 필요가 없습니다. 인증 요청이있을 때 서버가 보낸 해시 (또는 토큰) 만 저장할 수 있습니다.

  1. 이 토큰을 저장하고 요청에 반환됩니다 모든 좋은 경우 서버가 사용자 로그인/패스워드를 확인합니다
  2. 사용자를 인증하기 위해 API 호출을 확인 : 모든 지우기

    .

  3. 클라이언트 저장소 토큰
  4. 모든 후속 요청은
  5. 이 서버는 항상 토큰이 유효한지 확인하고, 토큰을 사용하여 현재 사용자를 찾거나 전송 다른 데이터됩니다 헤더에 그 토큰을 보내드립니다 헤더
관련 문제