레이블이 OAuth인 게시물을 표시합니다. 모든 게시물 표시
레이블이 OAuth인 게시물을 표시합니다. 모든 게시물 표시

2020년 10월 27일 화요일

Google Home OAuth 연결 개념 [해석]

 

OAuth linking concept guide

OAuth 연결 형식은 implicit 와 authorization code flows이라는 두 가지 산업 표준 OAuth 2.0 flow 을 지원합니다. implicit code flows에서 Google은 사용자의 브라우저에서 authorization endpoint를 엽니 다. 로그인에 성공하면, long-lived access token을 Google에 반환합니다. 이 access token은 어시스턴트에서 Action으로 보내는 모든 요청에 포함됩니다.

아래와 같은 경우, OAuth linking 솔루션을 추천합니다.

  ㅇ 기존 사용중인 OAuth 2.0 서버가 있지만, Google의 프로토콜의 단일 ID 자동 연결 및 계정 생성 token exchange endpoint를 확장하지 못하는 경우. (예: intent 추가 = get intent = 이 endpoint로의 변수 생성 요청)

OAuth 연결이 적합한 솔루션인지 확인하려면 계정 연결 유형 선택 페이지를 참조하세요.

Key terms(핵심 용어)

OAuth 연결 작동 방식을 읽기 전에 다음 용어를 숙지하십시오.

  • 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 : 데이터 액세스를 위해 사용자로부터 동의를 얻는 것을 담당하는 끝점입니다. 이 끝점은 다음을 수행합니다.
      1. 아직 로그인하지 않은 사용자에게 로그인 UI를 표시합니다.
      2. short-lived authorization code 형식의 접근 요청에 대한 동의내역을 기록합니다.
    • Token exchange endpoint : 서비스를 사용하려는 Action user에게 권한을 부여한 'token' 이라는 암호화 된 문자열을 얻는 데 사용됩니다 이 endpoint는 두 가지 유형의 교환을 담당합니다.
      1. 장기 refresh token 및 단기 access token에 대한 인증 코드를 교환합니다. 이 교환은 사용자가 계정 연결 flow을 수행할 때 발생합니다.
      2. 수명이 긴 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은 다음과 같이 요약 할 수 있습니다.

  1. 내 작업(action)은 사용자에게 자신의 계정을 서비스와 연결할 것인지 묻습니다.
  2. 사용자가 계정 연결에 동의하면 Google은 사용자의 브라우저에서 인증 엔드 포인트(로그인 페이지)를 엽니 다. 만약, 음성 전용 기기에서 작업(action)의 인증 흐름(flow)이 시작되면 Google은 모바일 화면으로 이동하여 인증을 실행합이다.
  3. 사용자가 로그인하고 (아직 로그인하지 않은 경우) API를 사용하여 데이터에 액세스 할 수있는 권한을 Google에 부여합니다 (아직 권한을 부여하지 않은 경우).
  4. 서비스에서 인증 코드를 생성 하고, 요청(request)에 인증 코드를 첨부하여 사용자의 브라우저(로그인 화면)에서 다시 Google로 리디렉션하여 Google에 반환합니다.
  5. Google은 - 코드의 신뢰성(authenticity)을 확인(verify)하고 access token 과 refresh token을 반환하는 - 토큰 교환 엔드 포인트로 인증 코드를 보냅니다 access token은 서비스가 API에 액세스하기위한 자격 증명을 허가하는 단기 토큰입니다. refresh token은 access token이 만료되면, Google이 새 access token을 획득하기위하여, 저장하고 사용하는 수명이 긴 토큰입니다.
  6. 사용자가 계정 연결 flow을 완료하면 어시스턴트에서 이행(fulfillment) 웹훅으로 전송되는 모든 후속 요청(subsequent request)에 액세스 토큰이 포함됩니다.

암시적(implicit) 코드 flow은 다음과 같이 요약 할 수 있습니다.

  1. 내 작업(action)은 사용자에게 자신의 계정을 서비스와 연결할 것인지 묻습니다.
  2. 사용자가 계정 연결에 동의하면 Google은 사용자의 브라우저에서 인증 엔드 포인트(로그인 페이지)를 엽니 다.
  3. 사용자가 로그인하고 (아직 로그인하지 않은 경우) API를 사용하여 데이터에 액세스 할 수있는 권한을 Google에 부여합니다 (아직 권한을 부여하지 않은 경우).
  4. 서비스는 액세스 토큰을 생성하고, 요청에 액세스 토큰을 첨부하여 브라우저의 Google 리디렉션으로, Google에 반환합니다.
  5. 사용자가 계정 연결 흐름을 완료하면 Google은 서비스의 API를 호출하고 각 요청에 액세스 토큰을 첨부합니다. 서비스는 액세스 토큰이 Google에 API 액세스 권한을 부여하는지 확인한 다음 API 호출을 완료합니다.

기본적인 인증(authorization) 코드 flow은 다음과 같습니다.

  1. 내 작업(action)은 사용자에게 자신의 계정을 서비스와 연결할 것인지 묻습니다.
  2. 사용자가 계정 연결에 동의하면 Google은 사용자의 브라우저에서 인증 엔드 포인트를 엽니 다. 작업의 음성 전용 기기에서 흐름이 시작되면 Google은 실행을 전화로 이관합니다.
  3. 사용자가 로그인하고 (아직 로그인하지 않은 경우) API를 사용하여 데이터에 액세스 할 수있는 권한을 Google에 부여합니다 (아직 권한을 부여하지 않은 경우).
  4. 서비스는 인증 코드를 생성 하고 요청에 첨부 된 단기 인증 코드를 사용하여 사용자의 브라우저를 다시 Google로 리디렉션하여 Google에 반환합니다.
  5. Google은 코드의 신뢰성을 확인하고 액세스 토큰 과 새로 고침 토큰을 반환하는 토큰 교환 엔드 포인트로 인증 코드를 보냅니다 액세스 토큰은 서비스가 API에 액세스하기위한 자격 증명으로 허용하는 단기 토큰입니다. 새로 고침 토큰은 만료 될 때 Google이 새 액세스 토큰을 획득하는 데 저장하고 사용할 수있는 수명이 긴 토큰입니다.
  6. 사용자가 계정 연결 흐름을 완료하면 어시스턴트에서 이행 웹훅으로 전송되는 모든 후속 요청에 액세스 토큰이 포함됩니다.


OAuth 연결 흐름

이 섹션에서는 OAuth 연결에서 발생할 수있는 다양한 flow에 대해 설명합니다.

각 flow에는 사용자가 작업을 호출 한 후 다음과 같은 일반적인 단계가 포함됩니다.

위의 flow는, 계정 연결 시스템 scene으로 전환하고 사용자 정의 된 근거를 제공합니다. 어시스턴트는 사용자에게 자신의 계정을 서비스에 연결할 것인지 묻고 요청 된 권한이있는 화면을 표시합니다. 사용자가 동의하면 Google은 사용자를 브라우저의 서비스 승인 엔드 포인트로 리디렉션합니다. 사용자는 로그인 (또는 구성에 따라 새 계정 생성)하고 데이터에 액세스 할 수있는 작업 권한을 부여합니다.

이 시점 이후의 흐름은 암시 적 흐름 또는 권한 부여 코드 흐름을 구현했는지 여부에 따라 다릅니다. 이러한 흐름은 다음 섹션에서 설명합니다.

Flow 1: User signs in with implicit flow

사용자가 로그인하고 자격 증명이 확인되면 서비스에서 수명이 긴 액세스 토큰을 만들고이를 Google에 반환합니다. 이 시점에서 작업의 사용자 ID는 로그인 한 계정에 연결되고 액세스 토큰은 Google이 서비스의 API에 수행하는 각 API 호출에 연결됩니다.

Flow 2: User signs in with authorization code flow

사용자가 로그인하고 자격 증명이 확인되면 서비스에서 인증 코드를 생성하여 Google에 반환합니다.

이 인증 코드는 액세스 토큰과 새로 고침 토큰을 모두 반환하는 토큰 교환 엔드 포인트로 전송됩니다. 이 시점에서 작업의 사용자 ID는 로그인 한 계정에 연결되며 어시스턴트에서 처리로 전송되는 모든 후속 요청에는 액세스 토큰이 포함됩니다.


2019년 12월 8일 일요일

[번역]Account linking - Google Assistant - Action on Google

Account Linking

Note: Account Linking 을 활성화 하는 Action은 Android(Go 에디션) 기기에서 현재 사용할 수 없다.

Account linking 을 통해서 구글 계정을 인증 시스템의 사용자 계정과 연결할 수 있다. 이를 통해서 사용자에게 풍부한 경험을 제공할 수 있다. 예를 들어, 사용자의 음식, 또는 음악 기본 설정, 거래 내역 및 기타 개인화 된 경험을 제공하는 데 사용할 수 있는 기타 정보를 저장할 수 있다.

Action이 다른 플랫폼 (웹 또는 Android)을 사용하는 기존 앱인 경우, Account linking 을 사용하여 모든 플랫폼에서 사용자가 기본 설정을 안전하게 사용할 수 있으므로, 일관된 크로스-플랫폼 환경이 보장된다.

Action on Google 에서 Account Linking은 Google Sign-In 을 사용하는데, 이것은 Google의 보안 인증 시스템 이고, 옵션으로, 업계 표준 프로토콜인 OAuth 2.0을 지원한다.

Account Linking 흐름 이해

Assistant 가 Google 계정을 사용자와 일치 시키면, account linking으로 해당 Google 계정에 액세스할 수 있는 권한을 사용자에게 요청할 수 있다.  계정 데이터를 사용하여 다음을 수행할 수 있다.

  • 사용자가 이미 다른 플랫폼에서 Action 또는 앱 중 하나를 사용할 때, 인증 시스템에서 계정과 일치하는 항목을 찾는 경우
  • 인증 시스템에서 새 사용자의 새 계정을 만들 경우

Action on Google은 세가지 계정 연결 타입을 제공한다.

Google Sign-in (구글 로그인)

Assistant 에서 Google Sign-in으로 Action이 Google profile의 사용자명, 이메일, 프로필 사진 등을 conversation 하는 동안 요청할 수 있다. 사용자는 음성으로 모든 작업이 가능하기 때문에, 자연스럽게 로그인할 수 있다.

이 유형의 Account linking은 다음의 경우 권장된다.

  • 기존 인증 시스템이 없다
  • 기존 인증 시스템이 있으나, @gmail.com 을 사용한 사용자만 연결한다.
자세한 내용은 Google Sign-In developer guide 를 참조.

OAuth and Google Sign-In

OAuth and Google Sign-in 링크 형식은 OAuth 기반 계정 연결 위에 Google Sign-In 을 추가한것이다. Google 사용자들에게 구글 이외의 인증 서비스를 활성화 하고자할 때, 완벽한 음성 기반 연결을 제공한다.
이 기능은, OAuth2 표준 흐름을 지원을 확장하여, Google 독점 extension 프로토콜을 추가 지원할 수 있도록 한다.

  • Google profile 정보를 사용한 완벽한 연결
  • Google profile 정보를 사용한 완벽한 계정 생성(optional)

이 형식의 account liinking은, 기존 인증 시스템이 있고, 사용자가 @gmail.com 이외의 주소에 연결할 수 있게 해야할 때 권장되는 형식이다.

OAuth

OAuth account linking 형식은, OAuthe 2.0 flow의 두 표준인 implicit 및 authorization code flow를 지원한다.

이 flow는 사용자 interaction을 음성에서 화면으로 이동해야하기 때문에 비추한다. 만약, oAuth2 서버가 있고, token exchange endpoint를 구글 자동 링킹 및 계정 생성용 ID token 프로토콜로 확장할 수 없을 때, 이 flow 사용을 고려하라.

추가 정보는 OAuth developer guide 참조.


2019년 12월 6일 금요일

[번역]Account linking with OAuth [Implicit flow]- developers.google.com

[원문] - 원문과 같으나, 현재 설정 화면은 다름


OAuth 로 Account linking 하기

OAuth linking type은 2개의 산업표준 [ implicit 와 authorization 코드 플로우] 가 있다

implicit code flow는 구글이 authorization endpoint를, 브라우저 안에서 열고, 로그인 성공한 후, long-lived access token 을 구글에 반환한다. 이 access token은 Assistant 에서 your Action 으로 보내는 모든 request 에 포함된다.

authorization code flow는 두개의 endpoint가 필요하다.
 ㅇ The authorization endpoint :  아직 로그인 하지 않은 사용자에게 로그인 UI를 제공하고, short-lived authorization code 형식으로 접근 요청을 동의 하고, 기록한다.
ㅇ The token exchange endpoint : 두가지 타입의 교환 역할을 담당한다.
  1. a long-lived refresh token 과 a short-lived access token의 인증 코드를 교환
  2. a short-lived access token을 a long-lived refresh token 으로 교체. 이 교환은 구글이 만료된 새 access token이 필요할 때 발생한다.

비록 the implicit code flow는 적용하기 간단하지만, 구글은 만료기간 없는 the implicit flow 를 access tokens 로 사용하길 권장한다. 토큰 만료된 the implicit flow 는 사양자를 다시 계정에 링크하도록 강요하기 때문이다. 만약, 보안등의 문제로 토큰 만료가 필요한 경우엔, 대신, the auth code flow 를 사용할것을 강력히 고려하라.

[ Implicit flow ] ======================

Implement OAuth account linking

ㅇ 금융 관련 계정 연결은 작업 검토에 6주 소요되므로, 릴리즈 계획에 시간 고려 필요.
금융 서비스 정책 참조

프로젝트 구성
OAuth 계정 연결을 사용하도록 프로젝트를 구성하려면 다음 단계를 수행할 것.
  1. the Actions Console 을 열고 사용하려는 프로젝트를 선택.
  2. Develop 탭을 클릭하고 Account linking 선택 .
  3. Account creation 에서 No, I only want to allow account creation on my website. 선택 
  4. Linking type 에서 OAuth and Implicit 선택.
  5. Client Information 에서  
        ㅇ 구글에서 오는 요청 식별에 Client ID issued by your Actions to Google 로 설정
        ㅇ Authorization 과 Token Exchange endpoint 의 URL을 입력



  • 참고 : 클라이언트 ID를 base64로 인코딩된 문자열로 보내려면, Configure your client (optional) 옆에있는 콤보박스에서 Google to transmit clientID and secret via HTTP basic auth header 에 체크함. 
    6. Save 클릭


OAuth 서버 구현
the OAuth 2.0 implicit flow를 지원하려면,  authorization endpoint가 HTTPS를 사용하도록 
서비스를 만들어야 한다. 이 endpoint 는 데이터 액세스에 대한 사용자의 인증 및 동의역할을 한다.  The authorization endpoint는 아직 로그인을 하지 않은 사용자에게 로그인 UI를 제공하고, 요청된 액세스에대한 동의를 기록한다.

액션이 인증관련 API를 호출해야 한다면, 구글은 이 엔드포인트를 사용하여, 사용자로부터 사용자를 대신해, 해당 API를 호출할 수 있는 권한을 얻는다.

일반적인 OAuth 2.0 implicit flow session은 다음과 같은 흐름을 갖는다.
  1. Google은 사용자의 브라우저에서 authorization endpoint 를 연다. 사용자는 아직 로그인하지 않은 경우 로그인하고, 아직 권한을 부여하지 않은 경우, API를 사용하여 데이터에 액세스 할 수있는 권한을 Google에 부여한다.
  2. 서비스는 access token 생성 하고 요청에 첨부 된 access token을 사용하여 사용자의 브라우저를 다시 Google로 리디렉션하여 access token을 Google에 반환한다.
  3. Google은 서비스 API를 호출하고 각 요청마다 access token을 첨부합니다. 서비스는 access token이 Google에 API 접근 권한을 부여했는지 확인한 다음, API 호출을 완료한다.

승인 요청 처리

액션이 OAuth2 implicit flow를 통해서 계정 연결을 수행해야하는 경우, Google은 아래 매개변수가 포함 된 요청으로 사용자를 권한부여 엔드포인트로 보낸다.
권한 엔드 포인트 매개 변수
client_idGoogle에 할당 한 고객 ID
redirect_uri이 요청에 대한 응답을 보내는 URL입니다.
state리디렉션 URI에서 변경되지 않은 채 Google에 다시 전달되는 부기 값입니다.
response_type응답에 반환 할 값의 유형입니다. OAuth 2.0 암시 적 플로우의 경우 응답 유형은 항상 token입니다.

예를들어, authorization endpoint가 https://myservice.example.com/auth 라면, 요청 명령은
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&response_type=token
위와 같을것이다.

authorization endpoint 가 로그인 요청을 처리하려면, 다음 단계를 수행한다.


  1. 의도하지 않거나 잘못 구성된 클라이언트 앱에 대한 액세스 권한을 부여하지 않으 려면 client_id및 redirect_uri값을 확인.
    • client_idGoogle에 할당 한 고객 ID와 일치 하는지 확인 .
    • redirect_uri 매개 변수로 지정된 URL의 형식이 다음과 같은지 확인.
      https://oauth-redirect.googleusercontent.com/r/ YOUR_PROJECT_ID
      YOUR_PROJECT_ID 는 작업 콘솔 의 프로젝트 설정 페이지 에있는 ID.
  2. 사용자가 서비스에 로그인했는지 확인. 사용자가 로그인하지 않은 경우, 서비스의 로그인 또는 가입 절차를 완료.
  3. Google이 API에 액세스하는 데 사용할 access token을 생성. access token은 임의의 문자열 값일 수 있지만, 토큰은, 사용자와 클라이언트를 고유하게 나타내야하며 추측 할 수 없어야함.
  4. 사용자의 브라우저에서 redirect_uri매개 변수로 지정된 URL로 redirect하는 HTTP response 을 전송 URL fragment에 다음 parameters를 모두 포함.
    • access_token: 방금 생성 한 액세스 토큰
    • token_type: 문자열 bearer
    • state: 원래 요청의 수정되지 않은 상태 값. 다음은 결과 URL의 예.

https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING

Google의 OAuth 2.0 redirect handler는 access token을 받고, state 값이 변하지 않다는걸 확인. Google이 Service에 대한 access token을 획득한 후, Google은 이후, AppRequest의 일부인, 액션 명령에 토큰을 첨부한다.

Start the authentication flow








Account Sign-in helper intent 를 사용해 the authentication flow를 시작한다.  아래 코드 스니펫은, 이 helper를 사용하기위한, Dialogflow 및 Actions SDK에서 응답을 보내는 방법을 기술한다.





Dialogflow:



const {dialogflow, SignIn} = require('actions-on-google');
const app = dialogflow({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
});
// Intent that starts the account linking flow.
app.intent('Start Signin', (conv) => {
  conv.ask(new SignIn('To get your account details'));
});

Actions SDK:



const {actionssdk, SignIn} = require('actions-on-google');
const app = actionssdk({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
});
// Intent that starts the account linking flow.
app.intent('actions.intent.TEXT', (conv) => {
  conv.ask(new SignIn('To get your account details'));
});


Handle data access requests

만약, Assistant request가 access token을 포함한다면, 우선 access token이 유효한가(만료되었나) 검사를 하고, DB에서 후속 사용자 계정을 검색 할 것.