Google Chat 사용자로 인증 및 승인하기

이 가이드에서는 사용자의 Google 사용자 인증 정보와 함께 OAuth 2.0을 사용하여 Chat API에 액세스하는 방법을 설명합니다. 사용자 인증 정보로 인증 및 승인하면 Chat 앱이 사용자 데이터에 액세스하고 인증된 사용자를 대신하여 작업을 수행할 수 있습니다. 사용자를 대신하여 인증하면 앱이 사용자와 동일한 권한을 가지며 마치 사용자가 실행한 것처럼 작업을 실행할 수 있습니다.

채팅 앱은 사용자 인증 정보로 API 호출을 인증하고 승인한 후 다음을 수행할 수 있습니다.

앱이 사용자 인증으로 작업(예: 스페이스 만들기)을 실행하면 Google Chat은 작업을 수행한 앱의 이름을 승인한 사용자에 관해 사용자에게 알려주는 저작자 표시 메시지를 표시합니다.

Google Chat 앱에서 사용자를 위한 스페이스를 만듭니다.
그림 1. 채팅 앱이 사용자 대신 스페이스를 만들 때 Google Chat이 표시하는 저작자 표시 메시지입니다.

채팅 앱에 인증이 필요한 경우와 사용할 인증 종류에 대한 자세한 내용은 Chat API 인증 및 승인 개요에서 필수 인증 유형을 참조하세요.

도메인 관리자는 도메인 전체 권한 위임을 부여하여 각 사용자의 동의 없이 애플리케이션의 서비스 계정이 사용자 데이터에 액세스하도록 승인할 수 있습니다. 도메인 전체 위임을 구성하면 서비스 계정이 사용자 계정을 가장할 수 있습니다. 서비스 계정이 인증에 사용되더라도 도메인 전체 위임은 사용자를 가장하므로 사용자 인증으로 간주됩니다. 사용자 인증이 필요한 모든 기능에 도메인 전체 위임을 사용할 수 있습니다.

기본 요건

이 가이드의 예를 실행하려면 다음과 같은 기본 요건이 필요합니다.

또한 다음과 같은 언어별 기본 요건이 필요합니다.

Java

  • JDK 1.7 이상
  • Maven 패키지 관리 도구
  • 초기화된 Maven 프로젝트입니다. 새 프로젝트를 초기화하려면 명령줄 인터페이스에서 다음 명령어를 실행하세요.

    mvn archetype:generate -DgroupId=com.google.chat.app.authsample -DartifactId=auth-sample-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
    

Python

  • Python 3.6 이상
  • pip 패키지 관리 도구

Node.js

  • Node.js
  • npm 패키지 관리 도구
  • 초기화된 Node.js 프로젝트입니다. 새 프로젝트를 초기화하려면 새 폴더를 만들고 새 폴더로 전환한 후 명령줄 인터페이스에서 다음 명령어를 실행합니다.

    npm init
    

Apps Script

1단계: OAuth 동의 화면 구성, 범위 지정, 앱 등록

승인을 위해 OAuth 2.0을 사용하면 Google에서 프로젝트, 정책, 요청된 승인 범위 요약이 포함된 동의 화면을 사용자에게 표시합니다. 앱의 OAuth 동의 화면을 구성하면 Google에서 사용자와 앱 검토자에게 표시하는 내용이 정의되고 나중에 게시할 수 있도록 앱이 등록됩니다.

OAuth 2.0을 사용하는 모든 앱에는 동의 화면 구성이 필요하지만 Google Workspace 조직 외부 사용자가 사용하는 앱의 범위만 나열하면 됩니다.

  1. Google Cloud 콘솔에서 메뉴 > API 및 서비스 > OAuth 동의 화면으로 이동합니다.

    OAuth 동의 화면으로 이동

  2. 앱의 사용자 유형을 선택한 다음 만들기를 클릭합니다.

  3. 앱 등록 양식을 작성한 다음 저장하고 계속하기를 클릭합니다.

  4. Add or Remove Scopes(범위 추가 또는 삭제)를 클릭합니다. 앱에 필요한 승인 범위를 추가 및 확인하고 업데이트를 클릭한 다음 저장 후 계속을 클릭합니다.

  5. 앱 등록 요약을 검토합니다. 수정을 클릭하여 변경하거나 대시보드로 돌아가기를 클릭합니다.

2단계: Google Cloud 콘솔에서 OAuth 클라이언트 ID 사용자 인증 정보 만들기

최종 사용자로 인증하고 앱의 사용자 데이터에 액세스하려면 OAuth 2.0 클라이언트 ID를 하나 이상 만들어야 합니다. 클라이언트 ID는 Google OAuth 서버에서 단일 앱을 식별하는 데 사용됩니다. 앱이 여러 플랫폼(예: Android, iOS, 웹)에서 실행되는 경우 플랫폼마다 별도의 클라이언트 ID를 만들어야 합니다.

OAuth 클라이언트 ID 사용자 인증 정보 만들기

OAuth 클라이언트 ID를 만드는 방법에 대한 자세한 안내를 보려면 애플리케이션 유형을 선택하세요.

웹 애플리케이션

  1. Google Cloud 콘솔에서 메뉴 > API 및 서비스 > 사용자 인증 정보로 이동합니다.

    사용자 인증 정보로 이동

  2. 사용자 인증 정보 만들기 > OAuth 클라이언트 ID를 클릭합니다.
  3. 애플리케이션 유형 > 웹 애플리케이션을 클릭합니다.
  4. 이름 입력란에 사용자 인증 정보의 이름을 입력합니다. 이 이름은 Google Cloud 콘솔에만 표시됩니다.
  5. 앱과 관련된 승인된 URI를 추가합니다.
    • 클라이언트 측 앱 (자바스크립트): 승인된 자바스크립트 출처에서 URI 추가를 클릭합니다. 그런 다음 브라우저 요청에 사용할 URI를 입력합니다. 애플리케이션이 OAuth 2.0 서버로 API 요청을 보낼 수 있는 도메인을 식별합니다.
    • 서버 측 앱 (자바, Python 등): 승인된 리디렉션 URI에서 URI 추가를 클릭합니다. 그런 다음 OAuth 2.0 서버가 응답을 보낼 수 있는 엔드포인트 URI를 입력합니다.
  6. 만들기를 클릭합니다. OAuth 클라이언트 생성 완료 화면이 나타나 새 클라이언트 ID와 클라이언트 비밀번호를 표시합니다.

    클라이언트 ID를 기록해 둡니다. 클라이언트 비밀번호는 웹 애플리케이션에 사용되지 않습니다.

  7. OK(확인)를 클릭합니다. 새로 만든 사용자 인증 정보가 OAuth 2.0 클라이언트 ID 아래에 표시됩니다.

Android

  1. Google Cloud 콘솔에서 메뉴 > API 및 서비스 > 사용자 인증 정보로 이동합니다.

    사용자 인증 정보로 이동

  2. 사용자 인증 정보 만들기 > OAuth 클라이언트 ID를 클릭합니다.
  3. 애플리케이션 유형 > Android를 클릭합니다.
  4. '이름' 입력란에 사용자 인증 정보의 이름을 입력합니다. 이 이름은 Google Cloud 콘솔에만 표시됩니다.
  5. 'Package name' 필드에 AndroidManifest.xml 파일의 패키지 이름을 입력합니다.
  6. 'SHA-1 인증서 지문' 입력란에 생성된 SHA-1 인증서 지문을 입력합니다.
  7. 만들기를 클릭합니다. OAuth 클라이언트 생성 완료 화면이 나타나 새 클라이언트 ID를 표시합니다.
  8. OK(확인)를 클릭합니다. 새로 만든 사용자 인증 정보가 'OAuth 2.0 클라이언트 ID'에 표시됩니다.

iOS

  1. Google Cloud 콘솔에서 메뉴 > API 및 서비스 > 사용자 인증 정보로 이동합니다.

    사용자 인증 정보로 이동

  2. 사용자 인증 정보 만들기 > OAuth 클라이언트 ID를 클릭합니다.
  3. 애플리케이션 유형 > iOS를 클릭합니다.
  4. '이름' 입력란에 사용자 인증 정보의 이름을 입력합니다. 이 이름은 Google Cloud 콘솔에만 표시됩니다.
  5. '번들 ID' 입력란에 앱의 Info.plist 파일에 나열된 번들 식별자를 입력합니다.
  6. 선택사항: 앱이 Apple App Store에 표시되는 경우 App Store ID를 입력합니다.
  7. 선택사항: '팀 ID' 입력란에 Apple에서 생성하여 팀에 할당한 고유한 10자 문자열을 입력합니다.
  8. 만들기를 클릭합니다. OAuth 클라이언트 생성 완료 화면이 나타나 새 클라이언트 ID와 클라이언트 비밀번호를 표시합니다.
  9. OK(확인)를 클릭합니다. 새로 만든 사용자 인증 정보가 'OAuth 2.0 클라이언트 ID'에 표시됩니다.

Chrome 앱

  1. Google Cloud 콘솔에서 메뉴 > API 및 서비스 > 사용자 인증 정보로 이동합니다.

    사용자 인증 정보로 이동

  2. 사용자 인증 정보 만들기 > OAuth 클라이언트 ID를 클릭합니다.
  3. 애플리케이션 유형 > Chrome 앱을 클릭합니다.
  4. '이름' 입력란에 사용자 인증 정보의 이름을 입력합니다. 이 이름은 Google Cloud 콘솔에만 표시됩니다.
  5. '애플리케이션 ID' 입력란에 앱의 고유한 32자 ID 문자열을 입력합니다. 앱의 Chrome 웹 스토어 URL 및 Chrome 웹 스토어 개발자 대시보드에서 이 ID 값을 찾을 수 있습니다.
  6. 만들기를 클릭합니다. OAuth 클라이언트 생성 완료 화면이 나타나 새 클라이언트 ID와 클라이언트 비밀번호를 표시합니다.
  7. OK(확인)를 클릭합니다. 새로 만든 사용자 인증 정보가 'OAuth 2.0 클라이언트 ID'에 표시됩니다.

데스크톱 앱

  1. Google Cloud 콘솔에서 메뉴 > API 및 서비스 > 사용자 인증 정보로 이동합니다.

    사용자 인증 정보로 이동

  2. 사용자 인증 정보 만들기 > OAuth 클라이언트 ID를 클릭합니다.
  3. 애플리케이션 유형 > 데스크톱 앱을 클릭합니다.
  4. 이름 입력란에 사용자 인증 정보의 이름을 입력합니다. 이 이름은 Google Cloud 콘솔에만 표시됩니다.
  5. 만들기를 클릭합니다. OAuth 클라이언트 생성 완료 화면이 나타나 새 클라이언트 ID와 클라이언트 비밀번호를 표시합니다.
  6. OK(확인)를 클릭합니다. 새로 만든 사용자 인증 정보가 OAuth 2.0 클라이언트 ID 아래에 표시됩니다.

TV 및 입력 제한 기기

  1. Google Cloud 콘솔에서 메뉴 > API 및 서비스 > 사용자 인증 정보로 이동합니다.

    사용자 인증 정보로 이동

  2. 사용자 인증 정보 만들기 > OAuth 클라이언트 ID를 클릭합니다.
  3. 애플리케이션 유형 > TV 및 제한된 입력 기기를 클릭합니다.
  4. '이름' 입력란에 사용자 인증 정보의 이름을 입력합니다. 이 이름은 Google Cloud 콘솔에만 표시됩니다.
  5. 만들기를 클릭합니다. OAuth 클라이언트 생성 완료 화면이 나타나 새 클라이언트 ID와 클라이언트 비밀번호를 표시합니다.
  6. OK(확인)를 클릭합니다. 새로 만든 사용자 인증 정보가 'OAuth 2.0 클라이언트 ID'에 표시됩니다.

Universal Windows Platform(UWP)

  1. Google Cloud 콘솔에서 메뉴 > API 및 서비스 > 사용자 인증 정보로 이동합니다.

    사용자 인증 정보로 이동

  2. 사용자 인증 정보 만들기 > OAuth 클라이언트 ID를 클릭합니다.
  3. 애플리케이션 유형 > 유니버설 Windows 플랫폼 (UWP)을 클릭합니다.
  4. '이름' 입력란에 사용자 인증 정보의 이름을 입력합니다. 이 이름은 Google Cloud 콘솔에만 표시됩니다.
  5. '스토어 ID' 입력란에 앱의 고유한 12자리 Microsoft Store ID 값을 입력합니다. 앱의 Microsoft Store URL과 파트너 센터에서 이 ID를 확인할 수 있습니다.
  6. 만들기를 클릭합니다. OAuth 클라이언트 생성 완료 화면이 나타나 새 클라이언트 ID와 클라이언트 비밀번호를 표시합니다.
  7. OK(확인)를 클릭합니다. 새로 만든 사용자 인증 정보가 'OAuth 2.0 클라이언트 ID'에 표시됩니다.

클라이언트 보안 비밀번호 JSON 파일 다운로드

클라이언트 보안 비밀번호 파일은 채팅 앱이 사용자 인증 정보를 제공할 때 참조할 수 있는 OAuth 클라이언트 ID 사용자 인증 정보의 JSON 표현입니다.

  1. Google Cloud 콘솔에서 메뉴 > API 및 서비스 > 사용자 인증 정보로 이동합니다.

    사용자 인증 정보로 이동

  2. OAuth 2.0 클라이언트 ID에서 앞서 만든 클라이언트 ID를 클릭합니다.

  3. JSON 다운로드를 클릭합니다.

  4. 파일을 client_secrets.json로 저장합니다.

3단계: Google 클라이언트 라이브러리 및 기타 종속 항목 설치

Google 클라이언트 라이브러리와 프로젝트에 필요한 기타 종속 항목을 설치합니다.

Java

Google 클라이언트 라이브러리와 기타 필수 종속 항목을 Maven 프로젝트에 추가하려면 프로젝트 디렉터리에서 pom.xml 파일을 수정하고 다음 종속 항목을 추가합니다.

<dependencies>
  <!-- ... existing dependencies ... -->
  <dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-chat</artifactId>
    <version>v1-rev20230905-2.0.0</version>
  </dependency>
  <dependency>
    <groupId>com.google.auth</groupId>
    <artifactId>google-auth-library-oauth2-http</artifactId>
    <version>1.19.0</version>
  </dependency>
  <dependency>
    <groupId>com.google.oauth-client</groupId>
    <artifactId>google-oauth-client-jetty</artifactId>
    <version>1.34.1</version>
  </dependency>
  <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.10.1</version>
  </dependency>
</dependencies>

Python

Python용 Google 클라이언트 라이브러리를 아직 설치하지 않았다면 명령줄 인터페이스에서 다음 명령어를 실행합니다.

pip3 install --upgrade google-api-python-client google-auth-oauthlib

Node.js

Google 클라이언트 라이브러리와 기타 필수 종속 항목을 Node.js 프로젝트에 추가하려면 프로젝트 디렉터리로 전환하고 명령줄 인터페이스에서 다음 명령어를 실행합니다.

npm install "@googleapis/chat" open server-destroy

Apps Script

이 샘플은 고급 채팅 서비스를 사용하여 Google Chat API를 호출합니다. Apps Script 프로젝트에 서비스를 사용 설정하려면 다음 안내를 따르세요.

  1. 왼쪽에서 편집기 를 클릭합니다.
  2. 왼쪽의 서비스 옆에 있는 서비스 추가 를 클릭합니다.
  3. Google Chat API를 선택합니다.
  4. 버전에서 v1을 선택합니다.
  5. Add를 클릭합니다.

클라이언트 라이브러리에서 지원되는 모든 언어를 사용할 수 있습니다.

4단계: Chat API를 호출하는 스크립트 작성

OAuth 승인을 사용하여 API를 호출하는 것은 여러 단계로 이루어진 프로세스입니다. 웹 또는 데스크톱 애플리케이션에서 이 프로세스는 일반적으로 다음과 같습니다.

  1. 앱이 승인 범위에 의해 지정된 사용자 데이터에 대한 액세스를 요청하는 승인 페이지로 사용자를 안내합니다. 앱은 클라이언트 ID 사용자 인증 정보로 자신을 식별합니다.
  2. 사용자는 앱에서 요청한 권한을 검토하고 요청을 승인합니다.
  3. Google의 인증 서버는 승인 코드와 함께 브라우저를 앱의 HTTP 엔드포인트로 리디렉션합니다.
  4. 애플리케이션이 Google 승인 서버에 다른 요청을 보내 승인 코드를 액세스 토큰으로 교환합니다.
  5. 애플리케이션은 액세스 토큰을 사용하여 사용자 대신 API를 호출합니다.

OAuth 승인 프로세스에 대한 자세한 내용은 OAuth 2.0을 사용하여 Google API 액세스 가이드를 참조하세요.

다음 자바, Python, Node.js 코드 샘플은 클라이언트 라이브러리를 사용하여 OAuth 승인 흐름을 실행합니다. 로컬 HTTP 서버를 열어 승인 서버에서 다시 승인 코드를 받은 후 액세스 토큰으로 교환합니다. Apps Script 코드 샘플에서 이 승인 흐름은 Apps Script에서 처리됩니다.

인증 과정을 완료한 후 스크립트는 사용자의 액세스 토큰을 사용하여 Chat API로 인증한 후 공백을 만듭니다.

Java

  1. 프로젝트 디렉터리에서 src/main/java/com/google/chat/app/authsample/App.java 파일을 엽니다.
  2. App.java의 콘텐츠를 다음 코드로 바꿉니다.

    package com.google.chat.app.authsample;
    
    import com.google.api.client.auth.oauth2.Credential;
    import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
    import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
    import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
    import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
    import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
    import com.google.api.client.http.HttpTransport;
    import com.google.api.client.json.JsonFactory;
    import com.google.api.client.json.gson.GsonFactory;
    import com.google.api.client.util.store.FileDataStoreFactory;
    import com.google.api.services.chat.v1.HangoutsChat;
    import com.google.api.services.chat.v1.model.Space;
    
    import java.io.InputStreamReader;
    import java.util.Collection;
    import java.util.Collections;
    
    /**
     * Authenticates with Chat API via user credentials, then creates a Chat space.
     */
    public class App {
        // Application OAuth credentials.
        private static final String KEYS_RESOURCE_URI = "/client_secrets.json";
    
        // Define your app's authorization scopes.
        private static final Collection<String> SCOPES =
            Collections.singleton("https://www.googleapis.com/auth/chat.spaces.create");
    
        // Directory to store user credentials.
        private static final java.io.File DATA_STORE_DIR =
            new java.io.File(System.getProperty("user.home"), ".store/auth-sample-app");
    
        // Global instance of the JSON factory.
        private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
    
        // Global instance of the HTTP transport.
        private static HttpTransport httpTransport;
    
        // Global instance of the DataStoreFactory. The best practice is to make it a single
        // globally shared instance across your application.
        private static FileDataStoreFactory dataStoreFactory;
    
        public static void main( String[] args ) {
            try {
                // Run app.
                httpTransport = GoogleNetHttpTransport.newTrustedTransport();
                dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR);
                Credential userCredential = authorize();
                Space response = App.createChatSpace(userCredential);
                // Print details about the created space.
                System.out.println(response);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * Authorizes the installed application to access user's protected data.
         */
        private static Credential authorize() throws Exception {
            // Load client secrets.
            GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
                new InputStreamReader(App.class.getResourceAsStream("/client_secrets.json")));
            // Set up authorization code flow.
            GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                httpTransport, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(dataStoreFactory)
                .build();
            // Authorize.
            return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
        }
    
        /**
         * Creates a Chat space.
         */
        private static Space createChatSpace(Credential userCredential) throws Exception {
            // Build the Chat API client and authenticate with the user account.
            HangoutsChat chatService = new HangoutsChat.Builder(
                httpTransport, JSON_FACTORY, userCredential)
                .setApplicationName("auth-sample-app")
                .build();
    
            // Create a Chat space.
            Space space = new Space()
                // To create a named space, set spaceType to SPACE.
                .setSpaceType("SPACE")
                // The user-visible name of the space.
                .setDisplayName("API-made");
            return chatService.spaces().create(space).execute();
        }
    }
    
  3. 프로젝트 디렉터리 내에 resources라는 새 하위 디렉터리를 만듭니다.

  4. client_secrets.json 파일을 resources 하위 디렉터리에 복사합니다.

  5. 프로젝트 패키지에 클라이언트 보안 비밀 파일을 포함하도록 Maven을 구성하려면 프로젝트 디렉터리에서 pom.xml 파일을 수정하고 다음 구성을 <build> 섹션에 추가합니다.

    <build>
      <!-- ... existing configurations ... -->
      <resources>
        <resource>
          <directory>resources</directory>
        </resource>
      </resources>
    </build>
    
  6. 프로젝트 패키지에 종속 항목을 포함하고 애플리케이션의 기본 클래스를 실행하도록 Maven을 구성하려면 프로젝트 디렉터리에서 pom.xml 파일을 수정하고 <plugins> 섹션에 다음 구성을 추가합니다.

    <plugins>
      <!-- ... existing configurations ... -->
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.google.chat.app.authsample.App</mainClass>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
    

Python

  1. client_secrets.json가 있는 동일한 디렉터리의 chat_space_create_named.py 파일에 다음 코드를 저장합니다.

    from google_auth_oauthlib.flow import InstalledAppFlow
    from googleapiclient.discovery import build
    
    # Define your app's authorization scopes.
    # When modifying these scopes, delete the file token.json, if it exists.
    SCOPES = ["https://www.googleapis.com/auth/chat.spaces.create"]
    
    def main():
      '''
      Authenticates with Chat API via user credentials,
      then creates a Chat space.
      '''
    
      flow = InstalledAppFlow.from_client_secrets_file(
                        'client_secrets.json', SCOPES)
      creds = flow.run_local_server()
    
      # Build a service endpoint for Chat API.
      service = build('chat', 'v1', credentials=creds)
    
      # Use the service endpoint to call Chat API.
      result = service.spaces().create(
    
        # Details about the space to create.
        body = {
    
          # To create a named space, set spaceType to SPACE.
          'spaceType': 'SPACE',
    
          # The user-visible name of the space.
          'displayName': 'API-made'
    
        }
    
      ).execute()
    
      # Prints details about the created space.
      print(result)
    
    if __name__ == '__main__':
      main()
    

Node.js

  1. Node.js 프로젝트와 client_secrets.json가 있는 동일한 디렉터리의 chat_space_create_named.js 파일에 다음 코드를 저장합니다.

    const fs = require('fs');
    const path = require('path');
    const http = require('http');
    const url = require('url');
    const destroyer = require('server-destroy');
    
    const chat = require('@googleapis/chat');
    
    // Application OAuth credentials.
    const keys = require('./client_secrets.json').installed;
    
    // Define your app's authorization scopes.
    // When modifying these scopes, delete the file token.json, if it exists.
    const scopes = ["https://www.googleapis.com/auth/chat.spaces.create"];
    
    // Create a new OAuth2 client with the configured keys.
    const oauth2Client = new chat.auth.OAuth2(
      keys.client_id,
      keys.client_secret,
      'http://localhost:3000'
    );
    
    /**
     * Opens an HTTP server to accept the OAuth callback.
     * In this simple example, the only request to our webserver is to /?code=<code>.
     */
    async function authenticate(scopes) {
      const opn = (await import('open')).default;
    
      return new Promise((resolve, reject) => {
        // Generate the URL for authorization.
        const authorizeUrl = oauth2Client.generateAuthUrl({
          access_type: 'offline',
          scope: scopes.join(' '),
        });
        // Start the HTTP server to listen for the callback.
        const server = http
          .createServer(async (req, res) => {
            try {
              const qs = new url.URL(req.url, 'http://localhost:3000').searchParams;
              res.end('Authentication successful! Please return to the console.');
              server.destroy();
              const { tokens } = await oauth2Client.getToken(qs.get('code'));
              oauth2Client.credentials = tokens;
              resolve(oauth2Client);
            } catch (e) {
              reject(e);
            }
          })
          .listen(3000, () => {
            // Open the browser to the authorize URL to start the workflow.
            opn(authorizeUrl, { wait: false }).then(cp => cp.unref());
          });
        destroyer(server);
      });
    }
    
    /**
     * Authenticates with Chat API via user credentials, then creates a Chat space.
     */
    async function createSpace() {
      // Create the Chat API client and authenticate with the authorized user.
      const chatClient = await chat.chat({
        version: 'v1',
        auth: oauth2Client
      });
    
      // Call the Chat API to create a space.
      const result = await chatClient.spaces.create({
    
        // Details about the space to create.
        requestBody: {
    
          // To create a named space, set spaceType to SPACE.
          'spaceType': 'SPACE',
    
          // The user-visible name of the space.
          'displayName': 'API-made'
    
        }
    
      });
      return result;
    }
    
    // Authenticate the user, execute the function,
    // then print details about the created space.
    authenticate(scopes)
      .then(createSpace)
      .then(console.log);
    

Apps Script

  1. Apps Script 편집기에서 appsscript.json 파일을 수정하고 API를 호출하는 데 필요한 OAuth 범위를 추가합니다.

      "oauthScopes": [
        "https://www.googleapis.com/auth/chat.spaces.create"
      ]
    
  2. 다음 코드를 Apps Script 프로젝트에서 ChatSpaceCreateNamed.gs라는 파일에 저장합니다.

    /**
     * Authenticates with Chat API via user credentials, then creates a
     * Chat space.
     */
    function createSpace() {
      try {
        // Details about the space to create.
        // To create a named space, set spaceType to SPACE.
        // The user-visible name of the space is displayName.
        const space = {'displayName': 'API-made', 'spaceType': 'SPACE'};
    
        // Call Chat API with user credentials to create the space.
        const result = Chat.Spaces.create(space);
    
        // Log details about the created space.
        console.log(result);
      } catch (err) {
        // TODO (developer) - Handle exception
        console.log('Failed to create space with error %s', err.message);
      }
    }
    

5단계: 예시 스크립트 실행

예를 실행하려면 명령줄에서 프로젝트 파일이 있는 디렉터리로 이동한 후 다음 명령어를 실행합니다.

Java

mvn compile assembly:single
java -jar target/auth-sample-app-1.0-SNAPSHOT-jar-with-dependencies.jar

Python

python3 chat_space_create_named.py

Node.js

node chat_space_create_named.js

Apps Script

Apps Script 편집기에서 ChatSpaceCreateNamed.gs 파일을 열고 Run을 클릭합니다.

브라우저가 열리고 Google 계정에 로그인하라는 메시지가 표시됩니다.

로그인하여 채팅 앱 승인

그림 2. 앱을 인증할 계정을 선택하는 OAuth 동의 화면

로그인하면 OAuth 동의 화면이 표시되고 앱에 권한을 부여할지 묻는 메시지가 표시됩니다.

권한을 부여한 후 스크립트는 Chat API를 호출합니다. 이 API는 표시 이름 API-made로 Chat 공간을 생성하여 응답합니다. 콘솔에 API 호출의 세부정보가 출력됩니다. 스페이스를 찾으려면 Google Chat에서 스페이스 패널로 이동합니다.

예시 문제 해결

chat_space_create_named.py를 실행할 때 다음과 같은 오류가 발생할 수 있습니다.

Expected a JSON object with a single property for a "web" or "installed" application

이 오류 메시지는 Google Cloud 콘솔에서 다운로드한 client_secrets.json 파일이 "web" 또는 "installed" 속성으로 시작하지 않음을 의미합니다. 다운로드한 파일로 인증한 후 코드가 token.json와 같은 새 파일에 액세스 토큰을 저장하지 않으면 액세스 토큰이 client_secrets.json에 작성되므로 후속 승인 시도 중에 이 오류가 발생할 수 있습니다.

오류를 해결하려면 Google Cloud 콘솔에서 클라이언트 보안 비밀번호 파일을 다시 다운로드하고 현재 파일의 위치에 새 파일을 저장합니다.

  • 애플리케이션이 단일 흐름의 범위를 벗어난 사용자 토큰을 계속 사용해야 하는 경우 토큰을 저장하여 나중에 재사용할 수 있습니다. 이 경우 애플리케이션은 사용자 토큰을 안전하게 처리하고 갱신 토큰 취소 및 만료를 처리해야 합니다. 자세한 내용은 OAuth 2.0 권장사항 가이드 사용을 참조하세요.

  • Chat API 참조 문서를 검토하여 Chat API로 할 수 있는 다른 작업에 대해 알아보세요.