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

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

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

  • Chat 스페이스 만들기
  • Chat 스페이스 및 그룹 대화에 사용자를 추가합니다.
  • 다음과 같이 다른 Workspace API에서 사용자 데이터를 사용합니다.

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

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

Chat 앱에 인증이 필요한 경우와 사용할 인증 유형에 관한 자세한 내용은 Chat API 인증 및 승인 개요의 필수 인증 유형을 참고하세요.

Google Workspace 관리자로 인증 및 승인

이 섹션에서는 Google Workspace 워크스페이스 관리자가 사용자 인증을 사용하여 조직 전체에서 Google Chat 앱과 스페이스를 관리하는 방법을 설명합니다.

도메인 전체 위임을 사용하여 인증 및 승인

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

관리자 권한을 사용하여 인증 및 승인

도메인 관리자 또는 관리자 권한을 가진 위임된 관리자는 관련 메서드의 요청에서 useAdminAccess 필드를 설정하여 관리자 권한으로 Google Chat API 호출을 인증하고 승인할 수 있습니다. 자세한 내용은 API 참조 문서를 참고하세요.

Google Chat 앱이 관리자 권한으로 작업을 실행하면 Chat은 사용자에게 작업을 실행한 Chat 앱의 이름이나 승인한 관리자의 이름을 알리지 않고 조직의 관리자가 작업을 실행했다고만 알립니다.

기본 요건

자바

  • Google Chat에 액세스할 수 있는 비즈니스 또는 엔터프라이즈 Google Workspace 계정
  • Google Cloud 프로젝트를 만듭니다.
  • Chat 앱의 이름, 아이콘, 설명을 사용하여 Google Chat API를 사용 설정하고 구성합니다.
  • 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

Node.js

Apps Script

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

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

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

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

    OAuth 동의 화면으로 이동

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

  3. 앱 등록 양식을 작성한 후 저장 및 계속을 클릭합니다.

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

  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를 추가합니다.
    • 클라이언트 측 앱 (JavaScript): 승인된 자바스크립트 원본에서 URI 추가를 클릭합니다. 그런 다음 브라우저 요청에 사용할 URI를 입력합니다. 애플리케이션에서 OAuth 2.0 서버로 API 요청을 보낼 수 있는 도메인을 식별합니다.
    • 서버 측 앱(Java, Python 등): 승인된 리디렉션 URI에서 URI 추가를 클릭합니다. 그런 다음 OAuth 2.0 서버가 응답을 보낼 수 있는 엔드포인트 URI를 입력합니다.
  6. 만들기를 클릭합니다. OAuth 클라이언트 생성 화면이 표시되고 새 클라이언트 ID와 클라이언트 비밀번호가 표시됩니다.

    클라이언트 ID를 기록합니다. 클라이언트 보안 비밀은 웹 애플리케이션에 사용되지 않습니다.

  7. 확인을 클릭합니다. 새로 생성된 사용자 인증 정보가 OAuth 2.0 클라이언트 ID 아래에 표시됩니다.

Android

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

    사용자 인증 정보로 이동

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

iOS

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

    사용자 인증 정보로 이동

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

Chrome 앱

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

    사용자 인증 정보로 이동

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

데스크톱 앱

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

    사용자 인증 정보로 이동

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

TV 및 입력 제한 기기

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

    사용자 인증 정보로 이동

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

Universal Windows Platform(UWP)

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

    사용자 인증 정보로 이동

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

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

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

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

    사용자 인증 정보로 이동

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

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

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

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

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

자바

Maven 프로젝트에 Google 클라이언트 라이브러리와 기타 필수 종속 항목을 추가하려면 프로젝트 디렉터리에서 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

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

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

Apps Script

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

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

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

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

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

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

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

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

인증 흐름을 완료한 후 스크립트는 사용자의 액세스 토큰을 사용하여 Chat API에 인증한 다음 공간을 만듭니다.

자바

  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단계: 예시 스크립트 실행

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

자바

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 파일을 열고 실행을 클릭합니다.

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

Chat 앱을 승인하기 위해 로그인합니다.

그림 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의 다른 기능을 알아보세요.