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에서 후속 사용자 계정을 검색 할 것.


댓글 없음: