2011-04-19 5 views
2

실제 두뇌 굴곡 세션이 끝난 후 오늘 나는 3 각형 OAuth 인증을 꽤 잘 이해하고 있다고 느낍니다. 아직도 이해가 안되는 것은 사용자 ID를 사용하는 것입니다. 지금까지 본 모든 예제는 예제 스크립트 맨 위에 임의로 사용자 ID를 지정하고 이동하는 것 같습니다. 그것은 나를 혼란스럽게합니다.3-legged OAuth 세션에서 사용자 ID 사용 이해?

내가 본 샘플 코드의 대부분은 OAuth "세션"을 관리하기 위해 사용자 ID와 OAuth 서버의 소비자 키를 사용한다는 개념을 중심으로 한 것 같습니다 (인용문에서는 용어를 브라우저 "세션"). 예를 들어 필자가 본 데이터베이스 샘플 코드는 사용자 ID 및 소비자 키 필드 값에 따라 토큰 및 기타 정보를 저장하고 검색합니다.

내가 이해의 몇 경쟁 단편 경쟁 불확실성과 충돌의 상태에 지금 나는 다음을 통해,

1)의 OAuth 세션 세부 레코드 또는 "OAuth를 저장"조회에 대한 이해가 맞으면 고객 키 및 사용자 ID 입력란을 입력 한 다음 OAuth 서버에 연결하는 응용 프로그램을 사용하는 각 사용자마다 서로 다른 사용자 ID를 사용하도록 요구하지 않습니다.

2) # 1이 맞으면 다른 사용자를 위해 내 자신의 사용자 계정을 만들지 않으려면 어떻게 피하려고합니까? 나는 OAuth가 가능한 서비스의 프론트 엔드 역할을하는 소프트웨어를 작성하려고 노력하고있다. 그래서 나는 내 자신의 사용자 기록과 그에 따르는 유지 보수의 어려움을 가질 필요가 없다. 대신 OAuth 서버가 퍼즐의 끝 부분을 처리하도록 할 것입니다. 그러나 내 접근법의 단점은 모든 세션에서 사용자를 다시 인증해야한다는 것입니다. 내 자신의 영구 사용자 계정/ID가 없으면 이전에 부여 된 "해지하기 좋은"액세스 토큰을 조회 할 수 없기 때문에, 옳은?

3) 내가 귀찮게하는 것은 인증되지 않은 토큰을 요청하는 동안 동적으로 지정된 콜백 URL을 전달할 수 없도록 일부 OAuth 서버에 대해 읽었으며 소비자 키와 사용자 ID가 다시 전달된다는 것입니다 불가능한. 대신 개발자/소비자로 등록 할 때 콜백 URL을 지정하면됩니다. 다행히도 내가 다루고있는 OAuth 서버는 그 기능을 허용하지만, 그렇지 않다면 상대방 키와 사용자 ID 쌍을 사용하는 전체 아이디어에 거대한 원숭이 렌치를 던지지 않을 것입니다. OAuth 세션 세부 정보의 색인을 생성 하시겠습니까?

답변

1
난 당신이 제기 것들을 조금을 취소합니다 희망이 문제에 대한 내 생각을 이야기하려고합니다

...

첫째, 아이디어는 OAuth를 서버가 일부 API 또는 데이터를 보호하고 있음을 인 타사 응용 프로그램 (소비자)이 액세스하려고합니다.

API에 OAuth 서버 뒤에 사용자 계정이나 데이터가없는 경우 소비자 애플리케이션에서 서비스를 사용하려는 이유 - 사용자에게 어떤 영향을 미치게 될까요? 즉, OAuth 서버가 있고 그 뒤에 사용자 계정이없는 시나리오를 상상할 수 없습니다.

API를 통해 사용자 데이터를 제공하지 않고 사용자 로그인에 OAuth 만 사용하려는 경우 OpenID를 사용하는 것이 더 좋지만 다시 사용자 계정을 가져야합니다.

고객 키와 (사용자) 사용자 ID를 통해 조회를하는 것이 올바른지, 이는 프로토콜 설계 때문입니다.

일반적인 흐름은 다음과 같습니다 소비자 응용 프로그램에

  1. OAuth를 서버 (공급자) 문제 무단 요청 토큰
  2. 소비자가 OAuth를 서버에서 요청 토큰을 승인하는 최종 사용자를 전송 (공급자)
  3. 최종 사용자가 토큰을 인증 한 후 액세스 토큰이 발행되어 소비자에게 제공됩니다 (여기서는 몇 가지 세부 정보와 단계를 생략했습니다. 예를 들어 소비자가 유효한 액세스 토큰을 받음). 끝)
  4. 승인 단계에서, 쌍으로 생성하고 저장하는 OAuth 서버 - 로컬 사용자 (공급자 용 로컬)가 어떤 소비자 (소비자 키 - 사용자 아이디 쌍)를 인증했는지.
  5. 그런 다음 소비자 응용 프로그램이 공급자로부터 최종 사용자 DATA 또는 API에 액세스하려고 할 때 액세스 토큰을 보냈지 만 사용자 세부 정보는 보내지 않습니다.
  6. 그런 다음 OAuth 서버 (제공자)는 사용자에게 사용자 데이터 또는 API 기능을 소비자에게 반환하기 위해 해당 토큰을 승인 한 로컬 USER ID가 토큰을 통해 확인할 수 있습니다.

나는 당신이 공급자 인 경우 당신이 당신 편이 아닌 로컬 사용자없이 갈 수 있다고 생각하지 않습니다.

고객 키 및 사용자 ID로 OAuth 세션을 처리하는 방법과 관련하여 동적 또는 정적 (등록시) 콜백 URL이있는 경우 콜백 관련 질문에 차이가 없다고 생각합니다. OAuth 사양 자체는 콜백 URL을 갖도록 요구하지 않습니다. 선택적 매개 변수를 가지며, 매번 전송할 선택적이거나 선택적으로 시작시 한 번만 등록 할 수 있습니다. OAuth 제공 업체는 어떤 옵션이 사용하기에 가장 적합한 지 결정하므로 이것이 다른 구현 방식입니다.

최종 사용자를 '거짓'콜백 URL로 리디렉션 할 수 없으므로 제공자가 소비자와 연결된 데이터베이스에 정적 정의 된 콜백 URL을 가지고있는 경우 더 안전한 접근 방법으로 간주됩니다.

예를 들어, 악의적 인 사람이 GreatApp의 소비자 키를 도용 한 경우 원래의 GreatApp로 가장 할 수있는 소비자 EvilApp로 만들 수 있으며 원본 그대로 OAuth 서버에 요청을 보낼 수 있습니다. 그러나 OAuth 서버가 정적 (미리 정의 된) 콜백 URL 만 허용하는 경우 EvilApp 요청은 항상 GreatApp 콜백 URL에서 끝나며 EvilApp는 액세스 토큰을 얻을 수 없습니다.

+1

네가 맞아. 나는 적어도 사용자 ID와 PIN으로 끝날 것입니다. 정적 콜백 URL 보안에 대한 좋은 지적. 하나의 질문. "악의적 인 사람이 GreatApp의 고객 키를 훔치는 경우"라고 말하면서도 비밀을 유지할 필요가 없습니까? 나는 그들이 당신의 콜백 URI를 분명히 볼 수있는 GET URL 인수로 다시 전달할 것을 제안하는 샘플 코드를 보았 기 때문에 희망한다. 예를 들어 oauth-php 샘플에서 "3 단계 : 서버에 액세스하기"섹션을 참조하십시오. http://code.google.com/p/oauth-php/wiki/ConsumerHowTo –

+0

네, 맞습니다. , 나는 오직 소비자 키와 소비자 비밀을 말 했어야했다. 왜냐하면 키만으로는 그다지 할 수 없기 때문이다. :) – middlehut

+0

@Lyuben, 공급자가 사용자 ID (논리적으로 들리 겠지만)를 가질 필요가 없으며 또한 고객? 따라서 OAuth를 로그인 시스템으로 사용하는 클라이언트는 OAuth 서버를 통해 인증하기 전에 사용자 (ID가있는 사용자)를 생성해야합니다. 인증이 실패하거나 액세스가 허용되지 않은 경우 빈 사용자 계정을 많이 만듭니다. OAuth를 로그인 시스템으로 사용하기가 어렵다면 OpenID가 더 좋습니다. – Lode

2

이다 the question by Lode에 대한 답변 :

이 아니라 공급자가 사용자 ID (즉, 논리적 소리)뿐만 아니라 클라이언트가 필요가 맞습니까? 따라서 OAuth를 로그인 시스템으로 사용하는 클라이언트는 OAuth 서버를 통해 인증하기 전에 사용자 (ID가있는 사용자)를 생성해야합니다. 인증이 실패하거나 액세스가 허용되지 않은 경우 빈 사용자 계정을 많이 만듭니다.

소비자 응용 프로그램에 로컬 계정이 없어도 사용자 인증에 OAuth를 사용할 수 있지만 내부 세션 표현을 사용하려면 일부 세션 메커니즘 (쿠키/매개 변수 얻기)이 있어야합니다. oauth_token을 저장합니다.

예를 들어, 누군가가 웹 응용 프로그램에 착륙했고 응용 프로그램이 일부 OAuth 공급자의 소비자 인 경우 최종 사용자를 위해 사이트에서 쿠키를 사용하여 로컬 세션을 만들어야합니다.그런 다음 토큰의 승인을 위해 최종 사용자를 OAuth 공급자에게 보내 응용 프로그램이 공급자로부터 보호 된 리소스를 얻을 수 있도록합니다. 현재 사용자에 대해 알지 못하며 자신의 신원을 신경 쓰지 않습니다. 공급자로부터 보호 된 정보를 사용하기 만하면됩니다.

사용자가 성공적인 인증 후에 공급자로부터 돌아와서 oauth_token을 가져 오면 이전에 사용자에 대해 생성 한 세션에이 토큰을 저장해야합니다. 세션을 유지하는 한 (그리고 리소스에 대한 추가 요청에 필요한 경우 토큰) 최종 사용자가 로그인 한 것으로 간주 할 수 있습니다. 세션을 삭제하거나 토큰이 만료되는 순간 해당 사용자를 고려할 수 있습니다 더 이상 로그인하지 마십시오. 이렇게하면 자신의 사용자 DB 테이블이나 스토리지 메커니즘을 만들 필요가 없습니다.

그러나 사용자 세션 (로그인)간에 사용되는 응용 프로그램의 사용자에 대한 지속적인 정보가 필요한 경우 정보를 연결할 사용자를 알기 위해 사용자를 유지 관리해야합니다 .

openid와 oauth의 차이는 로컬 계정의 관점에서 차이가 없습니다. 그것은 모두 동일합니다. 차이점은 openid를 사용하면 기본 사용자 정보 (전자 메일 등)를 즉시 수신하는 반면 Oauth를 사용하면 토큰을 받고 기본 사용자 정보 (전자 메일 등)를 얻기 위해 한 번 더 요청해야합니다.

OpenID 또는 OAuth를 사용하려는 경우 로컬 계정과 관련하여 차이는 없습니다.

+0

설명 주셔서 감사합니다. OAuth 공급자/서버가 보낸 요청과 동일한 요청 토큰을 사용하여 사용자에게 다시 세션을 전송할 때 세션이 실제로 필요하지 않다는 점을 고치겠습니까? 또한, 나는 그의 정보를 얻기 전에 사용자를 신경 쓰지 않습니다. 그래서, 정보를 얻을 때 나는 그 순간에 사용자가 정보의 소유자가되어 그녀를위한 로컬 계정을 만들 것이라고 생각합니다. 그 순간이 오기 전에 나는 옳은 것을 추적 할 것이 아무것도 없다. 아니면 세션을 통해이 프로세스에서 사용자를 추적하는 것이 보안 문제입니까? – Lode

+0

안녕하세요, 요청이오고있는 사용자를 이해할 수 없기 때문에 세션이 필요합니다. oauth 토큰을 영원히 URL에 넣지 않으면 사용자가 세션과 같이 항상 돌아 오지 않습니다 신분증). 어떤 OAuth 버전을 사용할 계획입니까? 1.0a 또는 2? – middlehut

+0

나는 1.0a를 사용하고있다. 세션과 관련하여 사용자가 OAuth를 사용하여 연결할 때마다 승인 후 이메일 주소를받습니다. 그래서 이것은 사용자가 누구인지 확인하는 방법입니다. 권리? – Lode