2009-10-24 7 views
30

간단한 REST-ish HTTP API를 제공하는 작은 애플리케이션을 작성하고 있습니다. 나는 인증의 결여로 인해 실패 신호를 보내는 방법을 결정하려고 애쓰는 중이다.RESTful API에서 신호 인증 실패

앱에 인증 용 API가 없지만 다른 서비스를 통해 클라이언트가 얻은 세션 토큰을 포함하는 쿠키가 있는지 여부에 따라 다릅니다. 앱은 세션을 확인하고 인증 프로세스를 통해 얻은 신원 정보를 사용하여 앱 별 인증을 수행합니다. 클라이언트가이 앱에 직접 인증 할 방법이 없습니다.

내 문제는 권한이없는 요청을 거부하는 명백한 HTTP 상태 코드 인 "401 Unauthorized"가 "WWW-Authenticate"헤더로 지정된다는 것입니다. rfc2616 sec 10.4.2을 참조하십시오.

응답이 요청 된 자원에 해당하는 시도를 포함하는 WWW 인증 헤더 필드 (제 14.47)를 포함해야한다.

나는 이것이 드문 문제라고 생각하지 않습니다. 보다 일반적인 용도를 포함하도록 단순히 401을 오버로드하는 것이 일반적입니까? 브라우저가 auth/e 대화 상자를 띄우는 것은 어떨까요 (우연히 테스트에서 보지 못했던 것인데, 아마도 POST에서는 발생하지 않을 수도 있습니다).

결론 :이 컨텍스트에서 401을 사용하는 것이 좋습니까? 아니면 더 좋은 해결책이 있습니까? 이 같은

+5

쿠키를 사용하는 경우 RESTful API가 아닙니다. REST 서비스는 정의에 따라 상태 비 저장됩니다. –

+0

공정한 점 - 설명을 RESTful이 아닌 REST-ish로 변경했습니다. 답변은 요청 별 인증을 올바르게 구현하거나 RESTishness에서 내 시도를 포기하는 것이라고 생각하십니까? – j0ni

+0

어려운 점은 응용 프로그램에 따라 다릅니다. REST 접근법에는 몇 가지 장점이 있습니다. 서버 측 세션을 계속 사용하려면 tvanfosson이 말한대로 403을 반환합니다. –

답변

30

, 당신은 내가 401를 보낼 것 대신 403 오류 (금지됨)를 반환하는 것이 좋습니다. 이렇게하면 헤더가 필요 없으며 서비스에 액세스 할 수 없음을 클라이언트에 알립니다.

+2

요청 방법이 HEAD가 아니며 서버가 요청을 이행하지 않은 이유를 공개하기를 원할 경우 엔 엔터티에서 거절 이유를 설명해야합니다 (SHOULD). 서버가 클라이언트가이 정보를 사용할 수 없도록하려면 상태 코드 404 (찾을 수 없음)를 대신 사용할 수 있습니다. (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) – vquintans

+1

@vquintans 404를 찾을 수 없습니다.이 경우 모호 할 수있는 것처럼 보입니다. 클라이언트가 존재할 수도 있고 존재하지 않을 수도있는 특정 리소스를 요청하지만 쿠키가없는 경우? 404 오류를 어떻게 해석 하시겠습니까? 자원을 사용할 수 없거나 인증 오류로 인해 실패 했습니까? 나는 승인의 필요성을 분명히 나타내는 응답을 고수 할 것이다. – tvanfosson

+0

예, 동의합니다. 그러나 어쨌든 RFC에서 그 가능성을 언급하는 것이 흥미 롭다고 생각합니다. – vquintans

8

반환 뭔가 : 당신이 API에서 인증 할 수있는 방법을 제공하지 않기 때문에 클라이언트가 인증하고 문제를 해결할 수 있지만, 경우에 일반적으로

HTTP/1.1 401 Unauthorized 
Location: https://example.com/auth-app/login