문제

저는 작업 중인 프로젝트에 대한 REST API 구축을 시작하고 있으며 RoR을 사용하여 API를 구축하는 가장 좋은 방법에 대해 약간의 조사를 하게 되었습니다.기본적으로 모델은 전 세계에 공개되어 있으며 URL 끝에 ".xml"을 넣고 적절한 매개변수를 전달하기만 하면 URL을 통해 호출할 수 있다는 사실을 꽤 빨리 알게 되었습니다.

그래서 다음 질문이 나왔습니다.무단 변경을 방지하기 위해 앱을 보호하려면 어떻게 해야 하나요?조사를 하다가 다음과 같은 몇 가지 기사를 발견했습니다. attr_accessible 그리고 attr_protected 그리고 그것들이 어떻게 사용될 수 있는지.이에 대해 제가 찾은 특정 URL은 2007년 5월에 게시되었습니다(여기).

루비와 마찬가지로 모든 것이 그 이후로 발전했다고 확신합니다.그래서 제 질문은 이것이 여전히 RoR 내에서 REST API를 보호하는 가장 좋은 방법입니까?입니다.

그렇지 않다면 "새 프로젝트" 또는 "기존 프로젝트" 시나리오에서 무엇을 제안합니까?

도움이 되었습니까?

해결책

API 요청을 인증하기위한 몇 가지 체계가 있으며 Restful_authentication 또는 Acts_as_authenticated와 같은 플러그인에서 제공하는 일반 인증과 다릅니다. 가장 중요한 것은 고객이 세션을 유지하지 않으므로 로그인의 개념이 없습니다.

HTTP 인증

기본 HTTP 인증을 사용할 수 있습니다. 이를 위해 API 클라이언트는 일반 사용자 이름과 비밀번호를 사용하여 URL과 같은 URL에 넣습니다.

http://myusername:mypass@www.someapp.com/

RESTFUL_Authentication은 상자 밖으로이를 지원한다고 생각하므로 API 또는 브라우저를 통해 누군가가 귀하의 앱을 사용하고 있는지 여부를 무시할 수 있습니다.

여기서 한 가지 단점은 사용자에게 모든 요청에서 사용자 이름과 비밀번호를 명시하도록 요청한다는 것입니다. SSL을 통해 수행하면 안전하게 만들 수 있습니다.

그래도 실제로 이것을 사용하는 API를 본 적이 없다고 생각합니다. 특히 현재 인증 체계에 의해 상자 밖으로 지원되기 때문에 나에게 상당히 좋은 생각처럼 보이므로 문제가 무엇인지 모르겠습니다.

API 키

API 인증을 활성화하는 또 다른 쉬운 방법은 API 키를 사용하는 것입니다. 본질적으로 원격 서비스의 사용자 이름입니다. 누군가가 당신의 API를 사용하기 위해 가입하면, 당신은 그들에게 API 키를 제공합니다. 이것은 각 요청에 따라 전달되어야합니다.

여기서 한 가지 단점은 누군가가 다른 사람의 API 키를 얻는다면 해당 사용자로서 요청을 할 수 있다는 것입니다. 모든 API 요청이 HTTP (SSL)를 사용하게 함으로써이 위험을 다소 상쇄 할 수 있다고 생각합니다.

또 다른 단점은 사용자가 어디에서나 동일한 인증 자격 증명 (API 키)을 사용한다는 것입니다. API 클라이언트에 대한 액세스를 취소하려면 유일한 옵션은 API 키를 변경하는 것입니다. 이는 사용자가 여러 API 키를 생성 할 수 있도록함으로써 완화 할 수 있습니다.

API 키 + 비밀 키 서명

감가 상각 된 (일종의) - 아래 OAUTH를 참조하십시오

더 복잡한 것은 비밀 키로 요청에 서명하는 것입니다. 이것이 Amazon Web Services (S3, EC2 등)입니다. 기본적으로 사용자에게 2 키 (예 : 사용자 이름)와 비밀 키 (예 : 비밀번호)를 제공합니다. API 키는 각 요청에 따라 전송되지만 비밀 키는 그렇지 않습니다. 대신, 일반적으로 다른 매개 변수를 추가하여 각 요청에 서명하는 데 사용됩니다.

IIRC, Amazon은 요청에 대한 모든 매개 변수를 가져 와서 매개 변수 이름으로 주문함으로써이를 달성합니다. 그런 다음이 문자열은 사용자의 비밀 키를 해시 키로 사용하여 해시됩니다. 이 새로운 값은 전송되기 전에 요청에 대한 새로운 매개 변수로 추가됩니다. 아마존 측에서 그들은 같은 일을합니다. 비밀 키를 사용하여 모든 매개 변수 (서명 제외)를 사용하고 주문하고 해시를 사용합니다. 이것이 서명과 일치하면 요청이 합법적이라는 것을 알고 있습니다.

여기서 단점은 복잡성입니다. 이 계획을 올바르게 작동시키는 것은 API 개발자와 클라이언트 모두에게 고통입니다. 일을 할 수없는 고객 개발자의 많은 지원 통화와 화난 이메일을 기대하십시오.

OAUTH

Key + Secret 서명의 복잡성 문제를 해결하기 위해 표준이 부름을 받았습니다. OAUTH. 핵심 Oauth에서 Key + Secret 서명의 맛이지만, 그 중 상당수는 표준화되어 있으며 많은 언어를위한 라이브러리.

일반적으로 API 생산자와 소비자 모두 자신의 키/서명 시스템을 만드는 대신 OAUTH를 사용하는 것이 훨씬 쉽습니다.

OAUTH는 본질적으로 액세스 할 수 있으므로 각 API 소비자에 대해 다른 액세스 자격 증명을 제공합니다. 이를 통해 사용자는 다른 소비 애플리케이션에 영향을 미치지 않고 액세스를 선택적으로 취소 할 수 있습니다.

구체적으로 루비에게는 다음과 같습니다 OAUTH 보석 이는 OAUTH의 생산자와 소비자 모두를 위해 상자 밖으로 지원을 제공합니다. 나는이 보석을 사용하여 API를 만들고 Oauth API를 소비하고 매우 감동했습니다. 응용 프로그램에 OAUTH가 필요하다고 생각되면 (간단한 API 키 구성표와 달리) OAUTH GEM을 쉽게 사용하는 것이 좋습니다.

다른 팁

다음을 방지하기 위해 앱을 보호하려면 어떻게 해야 하나요? 무단 변경?

attr_accessible 그리고 attr_protected 둘 다 ActiveRecord 모델에서 대량 할당을 수행하는 기능을 제어하는 ​​데 유용합니다.양식 주입 공격을 방지하려면 attr_protected를 사용하고 싶을 것입니다.보다 attr_protected를 사용하세요. 그렇지 않으면 해킹하겠습니다..

또한 다른 사람이 Rails 앱의 컨트롤러에 액세스하는 것을 방지하려면 일종의 사용자 인증 시스템이 필요하고 before_filter 요청한 컨트롤러 작업이 실행되도록 허용하기 전에 요청을 하는 승인된 사용자가 있는지 확인하기 위해 컨트롤러에서

참조 Ruby on Rails 보안 가이드 (Rails 문서화 프로젝트의 일부) 더 많은 유용한 정보를 얻으세요.

레일 애플리케이션에 대한 REST API를 구축하기 때문에 현재 귀하와 비슷한 질문에 직면하고 있습니다.

사용자 편집 할 수있는 속성 만 attr_accessible로 표시되는지 확인하는 것이 좋습니다. update_attributes를 사용하여 할당 할 수있는 흰색 속성 목록이 설정됩니다.

내가하는 일은 다음과 같습니다.

   class Model < ActiveRecord::Base  
       attr_accessible nil  
   end

내 모든 모델은 그것으로부터 상속되어 대량을 지정할 수있게하려는 모든 필드에 대해 attr_accessible을 정의해야합니다. 개인적으로, 나는 기본적 으로이 동작을 가능하게하는 방법이 있었으면 좋겠다.

누군가가 REST API를 사용하는 것뿐만 아니라 일반 양식 게시물을 사용하는 속성을 대량 할당 할 수 있다는 것을 알고 있습니다.

많은 물건을 직접 구축 할 수있는 또 다른 접근법은 다음과 같은 것을 사용하는 것입니다. http://www.3scale.net/ 개별 개발자를위한 키, 토큰, 할당량 등을 처리합니다. 또한 분석을 수행하고 개발자 포털을 만듭니다.

루비/레일 플러그인이 있습니다 루비 API 플러그인 트래픽이 도착하면 트래픽에 대한 정책에 적용됩니다. OAUTH 보석. 앱 앞에서 바니시를 떨어 뜨리고 바니시 리브 모드를 사용하여 우리를 우리에게도 할 수 있습니다. 광택 API 모듈.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top