OAuth linking concept guide
Key terms(핵심 용어)
- EndPoint : 끝점. 즉, IT 관점에서, SW의 최종 사용자가 사용하는 디바이스(PC, Mobile etc) 또는 사용자가 사용하는 SW (브라우저, App 등) 또는 그 화면 . 프로그램의 입장에선, 상대방 프로그램 으로 생각할 수 있음.
- flow : 일련의 처리 과정
- exchange token : 본래 토큰을 받기 위해선 여러 절차를 거치면서 주고받기 때문에 exchange(교환)이 맞으나, 결과적으로 토큰을 받기 때문에, '토큰 받기'로 번역하는것도 괜찮아 보임.
- prompt : cmd 프롬프트의 정의는 '명령어를 입력하여 어떤 작업을 수행하게하는 도구'임, 여기서는 사용자의 음성 명령을 입력하여, 작업을 수행하기위한 도구 ... 라는 개념이 맞는것 같음. 의역 하자면, '명령 입력 대기 상태' 라고도 볼 수 있을 것 같음.
- scene : 대화의 개별 상태를 나타냄. 주요 목적은 대화를 논리적 덩어리(chunk)로 구성하고 작업(tasks)을 실행하며 사용자에게 프롬프트를 반환함.
user.verificationStatus
: 현재 세션에 확인 된 사용자가 있는지 여부를 나타 내기 위해 시스템에서 설정하는 속성입니다.user.accountLinkingStatus
: 현재 세션의 사용자에게 연결된 ID가 있는지 여부를 나타 내기 위해 시스템에서 설정하는 속성입니다.계정 연결 시스템 scene : 계정 연결 flow 확인을 위해 구현된, 또는 특정 사용 사례에 맞게 사용자 지정할 수있는 사전 정의 된 scene입니다.
Authorization code flow : OAuth 2.0 flow를 처리하는 동안, Google은 사용자의 브라우저에서 인증 엔드 포인트를 엽니 다. 로그인에 성공하면 서비스에서 인증 코드를 생성 하여 Google에 반환합니다. Google은이 인증 코드를 토큰 교환 엔드 포인트로 전송하여 코드의 신뢰성을 확인하고 액세스 토큰 및 새로 고침 토큰을 반환합니다.
이 흐름에는 두 개의 끝 점이 필요합니다.
- Authorization(권한 부여) EndPoint : 데이터 액세스를 위해 사용자로부터 동의를 얻는 것을 담당하는 끝점입니다. 이 끝점은 다음을 수행합니다.
- 아직 로그인하지 않은 사용자에게 로그인 UI를 표시합니다.
- short-lived authorization code 형식의 접근 요청에 대한 동의내역을 기록합니다.
- Token exchange endpoint : 서비스를 사용하려는 Action user에게 권한을 부여한 'token' 이라는 암호화 된 문자열을 얻는 데 사용됩니다 . 이 endpoint는 두 가지 유형의 교환을 담당합니다.
- 장기 refresh token 및 단기 access token에 대한 인증 코드를 교환합니다. 이 교환은 사용자가 계정 연결 flow을 수행할 때 발생합니다.
- 수명이 긴 refresh token을 수명이 짧은 access token으로 교환합니다. 이 교환은 Google이 만료 되었기 때문에 새 access token이 필요할 때 발생합니다.
- Implicit(암시적) code flow : 이 OAuth 2.0 flow 동안에 Google은 사용자의 브라우저에서 로그인 페이지를 엽니 다. 로그인에 성공하면 수명이 긴 access token을 Google에 반환합니다. 이 access token은 어시스턴트에서 Action(작업)으로 보내는 모든 request(요청)에 포함됩니다. 이 흐름에는 로그인 페이지(권한 부여 끝점) 만 필요합니다.
- access token : 서비스에 사용자 데이터의 일부에 액세스 할 수있는 권한을 부여하는 토큰입니다. 액세스 토큰은 각 개별 사용자와 연결되어 있으며 추측 할 수 없어야합니다.
- refresh token : 단기 access token이 만료되면 새 access token을 받을 수 있는(교환되는) 토큰입니다.
작동 원리
이 섹션에서는 OAuth authorization code 및 implicit flow에 대한 일반적인 flow을 설명합니다. 다음 섹션 인 OAuth linking flow 에서는 OAuth에서 발생할 수있는 다양한 flow을 설명합니다.
authorization code flow은 다음과 같이 요약 할 수 있습니다.
- 내 작업(action)은 사용자에게 자신의 계정을 서비스와 연결할 것인지 묻습니다.
- 사용자가 계정 연결에 동의하면 Google은 사용자의 브라우저에서 인증 엔드 포인트(로그인 페이지)를 엽니 다. 만약, 음성 전용 기기에서 작업(action)의 인증 흐름(flow)이 시작되면 Google은 모바일 화면으로 이동하여 인증을 실행합이다.
- 사용자가 로그인하고 (아직 로그인하지 않은 경우) API를 사용하여 데이터에 액세스 할 수있는 권한을 Google에 부여합니다 (아직 권한을 부여하지 않은 경우).
- 서비스에서 인증 코드를 생성 하고, 요청(request)에 인증 코드를 첨부하여 사용자의 브라우저(로그인 화면)에서 다시 Google로 리디렉션하여 Google에 반환합니다.
- Google은 - 코드의 신뢰성(authenticity)을 확인(verify)하고 access token 과 refresh token을 반환하는 - 토큰 교환 엔드 포인트로 인증 코드를 보냅니다 . access token은 서비스가 API에 액세스하기위한 자격 증명을 허가하는 단기 토큰입니다. refresh token은 access token이 만료되면, Google이 새 access token을 획득하기위하여, 저장하고 사용하는 수명이 긴 토큰입니다.
- 사용자가 계정 연결 flow을 완료하면 어시스턴트에서 이행(fulfillment) 웹훅으로 전송되는 모든 후속 요청(subsequent request)에 액세스 토큰이 포함됩니다.
암시적(implicit) 코드 flow은 다음과 같이 요약 할 수 있습니다.
- 내 작업(action)은 사용자에게 자신의 계정을 서비스와 연결할 것인지 묻습니다.
- 사용자가 계정 연결에 동의하면 Google은 사용자의 브라우저에서 인증 엔드 포인트(로그인 페이지)를 엽니 다.
- 사용자가 로그인하고 (아직 로그인하지 않은 경우) API를 사용하여 데이터에 액세스 할 수있는 권한을 Google에 부여합니다 (아직 권한을 부여하지 않은 경우).
- 서비스는 액세스 토큰을 생성하고, 요청에 액세스 토큰을 첨부하여 브라우저의 Google 리디렉션으로, Google에 반환합니다.
- 사용자가 계정 연결 흐름을 완료하면 Google은 서비스의 API를 호출하고 각 요청에 액세스 토큰을 첨부합니다. 서비스는 액세스 토큰이 Google에 API 액세스 권한을 부여하는지 확인한 다음 API 호출을 완료합니다.
기본적인 인증(authorization) 코드 flow은 다음과 같습니다.
- 내 작업(action)은 사용자에게 자신의 계정을 서비스와 연결할 것인지 묻습니다.
- 사용자가 계정 연결에 동의하면 Google은 사용자의 브라우저에서 인증 엔드 포인트를 엽니 다. 작업의 음성 전용 기기에서 흐름이 시작되면 Google은 실행을 전화로 이관합니다.
- 사용자가 로그인하고 (아직 로그인하지 않은 경우) API를 사용하여 데이터에 액세스 할 수있는 권한을 Google에 부여합니다 (아직 권한을 부여하지 않은 경우).
- 서비스는 인증 코드를 생성 하고 요청에 첨부 된 단기 인증 코드를 사용하여 사용자의 브라우저를 다시 Google로 리디렉션하여 Google에 반환합니다.
- Google은 코드의 신뢰성을 확인하고 액세스 토큰 과 새로 고침 토큰을 반환하는 토큰 교환 엔드 포인트로 인증 코드를 보냅니다 . 액세스 토큰은 서비스가 API에 액세스하기위한 자격 증명으로 허용하는 단기 토큰입니다. 새로 고침 토큰은 만료 될 때 Google이 새 액세스 토큰을 획득하는 데 저장하고 사용할 수있는 수명이 긴 토큰입니다.
- 사용자가 계정 연결 흐름을 완료하면 어시스턴트에서 이행 웹훅으로 전송되는 모든 후속 요청에 액세스 토큰이 포함됩니다.
OAuth 연결 흐름
이 섹션에서는 OAuth 연결에서 발생할 수있는 다양한 flow에 대해 설명합니다.
각 flow에는 사용자가 작업을 호출 한 후 다음과 같은 일반적인 단계가 포함됩니다.
위의 flow는, 계정 연결 시스템 scene으로 전환하고 사용자 정의 된 근거를 제공합니다. 어시스턴트는 사용자에게 자신의 계정을 서비스에 연결할 것인지 묻고 요청 된 권한이있는 화면을 표시합니다. 사용자가 동의하면 Google은 사용자를 브라우저의 서비스 승인 엔드 포인트로 리디렉션합니다. 사용자는 로그인 (또는 구성에 따라 새 계정 생성)하고 데이터에 액세스 할 수있는 작업 권한을 부여합니다.
이 시점 이후의 흐름은 암시 적 흐름 또는 권한 부여 코드 흐름을 구현했는지 여부에 따라 다릅니다. 이러한 흐름은 다음 섹션에서 설명합니다.
Flow 1: User signs in with implicit flow
Flow 2: User signs in with authorization code flow
사용자가 로그인하고 자격 증명이 확인되면 서비스에서 인증 코드를 생성하여 Google에 반환합니다.
이 인증 코드는 액세스 토큰과 새로 고침 토큰을 모두 반환하는 토큰 교환 엔드 포인트로 전송됩니다. 이 시점에서 작업의 사용자 ID는 로그인 한 계정에 연결되며 어시스턴트에서 처리로 전송되는 모든 후속 요청에는 액세스 토큰이 포함됩니다.