타사 OAuth 공급자를 통한 인증을 계속 허용하면서 OAuth로 REST API 보안 유지 (DotNetOpenAuth 사용)


138

웹 사용자 인터페이스를 사용하지 않고도 제품 사용자가 제품 기능과 직접 통합 할 수 있도록 간단한 REST API가있는 제품이 있습니다.

최근 저는 데스크톱 사용자를 API와 통합하여 제품 사용자가 해당 타사 응용 프로그램을 사용하여 데이터에 액세스 할 수 있도록 다양한 타사로부터 관심을 얻었습니다.

Twitter를 사용하려는 응용 프로그램은 Twitter에서 호스팅하는 로그인 페이지를 사용하여 인증하여 특정 응용 프로그램에 해당 사용자의 데이터에 액세스 할 수있는 권한을 부여합니다. "허용"또는 "거부"버튼을 클릭하면 인증 프로세스가 완료됩니다. 페이스 북은 내가 알 수있는 것과 같은 메커니즘을 사용합니다.

추가 연구 결과, 이것은 실제로 작동하는 것으로 보이며 내 API가 .Net 기반이기 때문에 DotNetOpenAuth를 사용하고 유사한 메커니즘을 제공해야한다고 생각합니다. 불행히도 샘플은 드물게 문서화되어 있으며 (필요한 경우) 온라인에서 찾을 수있는 유일한 자습서는 타사 제공 업체를 사용하여 웹 사이트에 로그인 할 수 있도록 사용자에게 로그인 메커니즘을 제공하는 데 중점을 둔 것으로 보입니다.

내가 정말로하고 싶은 것은 내 REST API가 내 웹 응용 프로그램의 모든 핵심 인증 및 비즈니스 논리를 처리하고 본질적으로 내 웹 응용 프로그램이 본질적으로 OAuth를 통해 API를 사용하는 다른 응용 프로그램이어야한다는 것입니다. 사용자는 사용자 이름과 비밀번호를 사용하거나 MyOpenID 또는 Facebook과 같은 타사 제공 업체를 통해 웹 사이트에서 직접 인증 한 다음 반환 된 토큰을 사용하여 REST API에 대해 인증합니다.

건축도

기본적으로 OAuth 서비스를 호스팅하기 위해 API가 필요하지만 사용자가 타사 OAuth 서비스를 사용하도록하는 것 같습니다. 도움이 될 수는 없지만 OAuth에 대한 이해가 부족하여 내가 너무 복잡하게하는지 또는 내가하려고하는 것이 일을하는 좋은 방법인지 나쁜지를 결정하는 데 충분하지 않다고 생각합니다.

누군가 내가 수행해야 할 단계에 대한 포괄적 인 개요를 제공 할 수 있습니까? 아니면 몇 가지 튜토리얼을 알려주시겠습니까? 아니면 내 제안을 폭로하고 (건축 적으로) 이것에 대해 내가 잘못 가고 있다고 말합니까?


안녕하세요 Nathan, 나는 당신이 여기에 설명하는 것과 비슷한 시나리오로 고생하고 있으며 내 API stackoverflow.com/
Jammer

답변:


123

먼저 인증과 권한 부여의 차이점을 강조하고 싶습니다.

사용자의 사용자 이름 + 암호와 같은 일부 자격 증명 등을 제공하여 웹 사이트에 인증합니다. OpenID는 사용자 가 다른 서비스를 인증 하도록 하여이를 대체 할 수 있으며 , 사용자를 대신하여 웹 사이트에 사용자의 신원을 부여합니다. 귀하의 사이트는 타사 서비스 (OpenID 공급자)를 신뢰하므로 사용자가 로그인 한 것으로 간주합니다.

서비스 또는 응용 프로그램은 웹 사이트에 인증하지 않습니다 - 적어도하지 일반적으로. 사용자 는 서비스 또는 애플리케이션이 사용자의 데이터에 액세스 할 수있는 권한을 부여 합니다. 이는 일반적으로 응용 프로그램이 서비스 공급자의 권한 부여를 요청한 다음 사용자를 서비스 공급자에게 보내면 사용자가 먼저 인증 한 다음 (서비스 공급자가 누구와 대화하는지 알 수 있음) 사용자가 사이트에 "예, [어플리케이션]이 내 데이터에 [제한된 방식으로] 액세스하는 것이 좋습니다 "". 그때부터 응용 프로그램은 인증 토큰을 사용합니다.서비스 제공 업체 사이트의 사용자 데이터에 액세스합니다. 응용 프로그램은 마치 사용자 인 것처럼 자체 인증하지는 않지만 다른 코드를 사용하여 서비스가 특정 사용자의 데이터에 액세스 할 수있는 권한이 있는지 확인합니다.

따라서 이러한 차이점을 명확히하여 사이트에서 인증 및 권한 부여에 대해 완전히 독립적으로 결정할 수 있습니다. 예를 들어, 사용자가 username + password, OpenID 및 Facebook 모두로 로그인 할 수있게하려면 그렇게 할 수 있습니다. 완전히 직교하는 결정은 응용 프로그램을 인증하는 방법입니다 (OAuth는 물론 널리 사용되는 많은 프로토콜이 있습니다).

OpenID는 사용자 인증에 중점을 둡니다 . OAuth는 응용 프로그램 인증에 중점을 둡니다 . 그러나 Facebook 및 Twitter와 같은 일부 서비스는 인증에 OpenID를 사용하고 인증에 OAuth를 사용하는 대신 인증 권한 부여에 OAuth를 사용하도록 선택했습니다 .

이제 자신의 프로젝트의 경우 VS Gallery에서 제공되는 ASP.NET MVC 2 OpenID 웹 사이트 (C #) 프로젝트 템플릿 을 확인하는 것이 좋습니다 . 기본적으로 OpenID 인증 OAuth 서비스 공급자 지원이 제공됩니다. 즉, 사용자는 OpenID로 로그인 할 수 있으며 타사 응용 프로그램 및 서비스는 OAuth를 사용하여 웹 사이트에 대한 API 호출을 수행하고 사용자 데이터에 액세스 할 수 있습니다.

일단이 프로젝트 템플릿에 추가하고 싶은 것처럼 보이는 것은 사용자가 OpenID뿐만 아니라 username + password로 로그인 할 수 있다는 것입니다. 또한 Facebook 및 Twitter를 사용자에게 옵션으로 사용하려면 OpenID 표준을 사용하지 않으므로이를 구현해야합니다. 그러나 DotNetOpenAuth 다운로드에는 Twitter 및 Facebook으로 로그인하기위한 샘플이 포함되어 있으므로 이에 대한 지침이 제공됩니다.

나는 당신이 인증 전선에서 할 일이별로 없을 것이라고 생각합니다. 내가 전에 말한 것처럼 OAuth와 함께 제공되며 아마도 당신에게 충분할 것입니다.


자세한 답변을 보내 주셔서 감사합니다. 제공 한 링크를 확인하겠습니다. 명확히하기 위해 내 API가 내 웹 사이트의 하위 도메인에 매달려 있으므로 기술적으로 동일한 응용 프로그램이 아닙니다.
Nathan Ridley

1
앱이 리소스를 소유 할 때 사용자가 아닌 권한 부여 서버에 앱을 인증해야하는 비정형 시나리오가 발생합니다. 예를 들어, 페이스 북 앱은 일정 기간 동안 수집 한 앱 통찰력 및 통계 데이터를 fb resouce 서버에 요청할 수 있습니다. 이 시나리오는
SenG

oAuth없이 REST API를 사용할 수 있습니까? @Andrew Arnott
보석

물론이야. 모든 나머지 API가 전혀 인증을 요구하지는 않습니다. 그리고 oauth만이 유일한 인증 메커니즘은 아닙니다.
Andrew Arnott

11

가장 먼저. 인증 방법과 API를 정신적으로 분리해야합니다.

API는 기본적으로 리소스이며 해당 리소스를 조작하는 방법입니다. 또한 API에 대한 액세스를 인증하는 몇 가지 방법을 사용할 수 있습니다.

OAuth는 그러한 인증 메커니즘 중 하나입니다. 사양이 이해하기 어렵지만 특히 서명과 관련된 부분이 있어도 OAuth 공급자는 훌륭합니다. OAuth를 설치하면 대부분의 언어로 사용할 수있는 "오픈 소스, 이미 구현 된 구현"라이브러리가 너무 많기 때문에 클라이언트 응용 프로그램은 일반적으로 인증하기가 쉽습니다.

OAuth의 장단점은 한동안 논의되었습니다. 그러나 OAuth 사양을 담당하는 사람들 중 하나 인 Eran Hammer-Lahav가 작성한이 명확한 가이드를 읽는 것이 좋습니다 .

내가 아는 한 OAuth의 유일한 대안은 OAuth 2.0과 단순한 기본 인증입니다.

그 외에 Open-ID 또는 페이스 북 ID 등을 사용하여 인증하는 것에 대해 이야기하고 있습니다. 이것은 또 다른 질문입니다. 그러나 실제로 API 및 OAuth 범위를 벗어납니다. 나에게, 그것은 당신의 서비스에서 사용자 생성에 대한 더 많은 질문을 느낍니다. 내가 틀렸을 수도 있습니다.


oAuth없이 REST API를 사용할 수 있습니까? @ 존 Nylander
보석
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.