2013-07-25 6 views
5

내가 만드는 API에 OAuth2를 사용하려고하지만 흐름이 작동하는 방법에 대한 설명을 사용할 수 있습니다. 유사한 질문 (예 : Securing my REST API with OAuth while still allowing authentication via third party OAuth providers (using DotNetOpenAuth))을 발견했지만 제 3 자 로그인과 관련하여 명확한 내용을 제공하지 않습니다.맞춤 API 용 OAuth2

위임에 의한 인증이 정상적으로 작동하는 경우 특히 OpenID를 사용하고 싶지 않습니다 (어쨌든). 지나치게 복잡해 보이고 제대로 지원되는 라이브러리가 많지 않습니다. 문제는 4 (틱) 엔티티로 분리

(내가 PHP + Laravel 4 사용하고 있습니다) : - 최종 사용자

  • 클라이언트 -

    • 자원 소유자 브라우저 (내 웹 사이트), 모바일 앱 또는 이와 유사한 도구
    • 인증 서버 - 내 OAuth2 서버
    • 리소스 서버 - 내 API. 사용자 데이터를 제공합니다.

      1. 사용자는 클라이언트에서 사용자 이름/암호를 채 웁니다 :

    가 나는 사용자가 내 인증 서버와 로그인 계정 사용에 계정을 만들 때의 흐름을 알아 냈어요 생각합니다.

  • 클라이언트는 리소스 소유자 흐름을 사용하여 인증 서버에 연결하고 사용자를 인증하며 클라이언트를 자동으로 인증합니다.
  • 사용자는 User ID가 포함 된 Token + signed JWT를 사용하여 AU 서버에서 클라이언트로 다시 리디렉션됩니다.
  • 클라이언트는 토큰을 세션에 저장합니다.
  • 클라이언트는 토큰 + 서명 된 JWT 사용자 ID를 사용하여 자원 서버에서 데이터를 요청합니다.
  • 자원 서버는 JWT의 유효성을 검사하고 토큰 범위에 따라 데이터를 반환합니다.
  • 아직 워크 플로를 테스트하지는 않았지만 작동하는 것처럼 보입니다. 그러나 제 3 자 로그인은 더욱 어려워졌습니다. 이것이 내가 지금까지 가지고있는 것입니다 :

    1. Google/Facebook/LinkedIn을 통한 사용자 클릭 로그인.
    2. 사용자가 클라이언트에서 Google의 인증 서버 (광산 아님)로 리디렉션됩니다.
    3. 사용자가 user/pass를 사용하여 로그인하고 클라이언트가 일부 보호 된 리소스 (userinfo.email)를 가져올 수 있도록 권한 부여 - 위임을 통해 사용자를 인증합니다.
    4. 사용자가 Google 사용자 ID가 포함 된 Token + signed JWT로 다시 클라이언트로 리디렉션됩니다.
    5. 클라이언트가 JWT의 유효성을 검사합니다.
    6. 클라이언트는 클라이언트 자격 증명 플로우를 사용하여 자원 서버에 연결합니다. 새로운 토큰을받습니다.
    7. 클라이언트는 토큰을 세션에 저장합니다.
    8. Google 사용자 ID를 애플리케이션 사용자 ID로 변환하라는 클라이언트 요청. (이 연결은 가입하는 동안 만들어졌습니다.)
    9. 리소스 서버가 응용 프로그램 사용자 ID를 반환합니다. (서명 된 JWT)
    10. 클라이언트는 토큰 + 서명 된 JWT 사용자 ID를 사용하여 자원 서버에서 데이터를 요청합니다.
    11. 자원 서버는 JWT의 유효성을 검사하고 토큰 범위에 따라 데이터를 반환합니다.

    이것은 효과가있을 수 있지만 너무 복잡합니다. 이러한 단계 중 일부를 건너 뛰는 방법이 반드시 있어야합니다. 나는 특히 8-10 단계에 관심이있다. 내가 아는 한, 사용자는 제 3 자 로그인을 사용하여 인증 서버와 전혀 상호 작용할 필요가 없습니다. 문제는 내 API에서 Google/Facebook/LinkedIn의 성공적인 id_token (또는 무언가)을 "계정"리소스에 가장 잘 연결하는 방법입니다.

    지금 당장은 다른 클라이언트가 API에 연결하는 것에 대해 걱정하지 않지만 앞으로는 언젠가는 발생할 수 있습니다.

    +0

    내가 이러한 API 중 하나가 사용자의 이메일을 제공합니다 생각하지 않습니다

    은 OAuth2를의 사용을 설명하는이 자원을 발견. 따라서 여러 개의 소셜 계정 로그인을 그룹화하는 고유 한 ID가 없을 수도 있습니다. API에서 인증 된 후에 사용자에게 세부 정보를 입력하도록 요청할 수 있습니다. API 측면에서 OAuth2 API 프레임 워크를 사용하는 것이 좋습니다. 그들은 내부에 모든 것을 갖추고있어 다른 것들에 대해 걱정할 시간을 더 많이 가질 것입니다. :) – astroanu

    답변

    0

    "알고있는 한, 사용자는 제 3 자 로그인을 사용하여 인증 서버와 전혀 상호 작용할 필요가 없습니다." 그건 부분적으로 사실입니다. 이론적으로, 타사 로그인의 토큰을 자신의 것으로 사용할 수 있습니다. 그래서 정상적인 자원 요청은 다음과 같습니다

    1. 클라이언트는 자원 요청 - (제 3 자로부터) 토큰 전송 및 로그인 유형 (등 페이스 북/구글 /)
    2. 서버는 제 3 자와 토큰을 확인하여 요청의 유효성을 확인 Authorization Server를 실행하고 데이터를 리턴합니다.

    단점은 API 서버가 요청이있을 때마다 (타사 서버가 필요하든 아니든) 제 3 자 서버와 대화해야한다는 것입니다. 대신 자신의 토큰을 생성 할 때 더 많은 제어가 가능하며 요청을 검증하는 것이 더 간단합니다.

    나는 당신의 워크 플로우를 고수하겠다. 나는 비슷한 것을 한 번했고 나의 발걸음은 거의 같았다. "계산"단계도 고려해야합니다. 2-4 단계의 경우 Google, Facebook 및 공동 작업이 이미 잘 수행되었으므로 기본적으로 아무 것도하지 않아야합니다.)