푸시 알림

이 문서에서는 리소스가 변경될 때 애플리케이션에 이를 알려주는 푸시 알림을 사용하는 방법을 설명합니다.

개요

Directory API는 리소스의 변경사항을 모니터링할 수 있는 푸시 알림을 제공합니다. 이 기능을 사용하여 애플리케이션의 성능을 개선할 수 있습니다. 이를 통해 리소스 폴링과 관련된 추가 네트워크 및 컴퓨팅 비용을 없애 리소스 변경 여부를 확인할 수 있습니다. 감시된 리소스가 변경될 때마다 Directory API가 애플리케이션에 알립니다.

푸시 알림을 사용하려면 다음 두 가지 작업을 수행해야 합니다.

  • 수신 URL 또는 '웹훅' 콜백 수신자를 설정합니다.

    이는 리소스가 변경될 때 트리거되는 API 알림 메시지를 처리하는 HTTPS 서버입니다.

  • 감시하려는 각 리소스 엔드포인트에 대한 알림 채널을 설정합니다.

    채널은 알림 메시지의 라우팅 정보를 지정합니다. 채널 설정 과정에서 알림을 받을 특정 URL을 지정해야 합니다. 채널의 리소스가 변경될 때마다 Directory API가 해당 URL에 알림 메시지를 POST 요청으로 전송합니다.

현재 Directory API는 사용자 리소스의 변경사항에 대한 알림을 지원합니다.

알림 채널 만들기

푸시 알림을 요청하려면 모니터링하려는 리소스마다 알림 채널을 설정해야 합니다. 알림 채널이 설정되면 감시된 리소스가 변경되면 Directory API가 애플리케이션에 알립니다.

시청 요청

시청 가능한 각 Directory API 리소스에는 다음 형식의 URI에 연결된 watch 메서드가 있습니다.

https://www.googleapis.com/API_NAME/API_VERSION/RESOURCE_PATH/watch

특정 리소스의 변경사항에 관한 메시지의 알림 채널을 설정하려면 리소스의 watch 메서드에 POST 요청을 보냅니다.

각 알림 채널은 특정 사용자 및 특정 리소스 (또는 리소스 집합)와 모두 연결됩니다. 현재 사용자 또는 서비스 계정이 이 리소스를 소유하거나 이 리소스에 액세스할 권한이 없으면 watch 요청이 성공하지 않습니다.

단일 도메인의 User 리소스에 대한 모든 감시 요청은 다음과 같은 일반적인 형식을 취합니다.

POST https://admin.googleapis.com/admin/directory/v1/users/watch?domain=domain&event=event
Authorization: Bearer auth_token_for_current_user
Content-Type: application/json

{
  "id": "01234567-89ab-cdef-0123456789ab", // Your channel ID.
  "type": "web_hook",
  "address": "https://mydomain.com/notifications", // Your receiving URL.
  ...
  "token": "target=myApp-myFilesChannelDest", // (Optional) Your channel token.
  "params": {
    "ttl": 3600 // (Optional) Your requested time-to-live for this channel.
  }
}

domainevent 매개변수를 사용하여 알림을 수신할 이벤트 및 도메인을 지정합니다.

고객의 사용자 리소스에 대한 모든 시청 요청은 다음과 같은 일반 형식을 취합니다.

POST https://admin.googleapis.com/admin/directory/users/v1/watch?customer=customer&event=event
Authorization: Bearer auth_token_for_current_user
Content-Type: application/json

{
  "id": "01234567-89ab-cdef-0123456789ab", // Your channel ID.
  "type": "web_hook",
  "address": "https://mydomain.com/notifications", // Your receiving URL.
  ...
  "token": "target=myApp-myFilesChannelDest", // (Optional) Your channel token.
  "params": {
    "ttl": 3600 // (Optional) Your requested time-to-live for this channel.
  }
}

customerevent 매개변수를 사용하여 고객 Google 계정의 고유 ID 및 알림을 받을 이벤트 유형을 지정합니다.

가능한 event 값은 다음과 같습니다.

  • add: 사용자 생성 이벤트
  • delete: 사용자가 삭제된 이벤트
  • makeAdmin: 사용자 관리자 상태 변경 이벤트
  • undelete: 사용자가 이벤트를 삭제 취소했습니다.
  • update: 사용자가 이벤트을 업데이트했습니다.

참고: 다음 예에서는 명확성을 위해 요청 본문을 생략합니다.

도메인 mydomain.com에 대한 사용자 생성 이벤트를 확인합니다.

POST https://admin.googleapis.com/admin/directory/v1/users/watch?domain=mydomain.com&event=add

고객 my_customer의 사용자 생성 이벤트를 확인합니다.

POST https://admin.googleapis.com/admin/directory/v1/users/watch?customer=my_customer&event=add

필수 속성

watch 요청에 다음 필드를 제공해야 합니다.

  • 프로젝트 내에서 이 새 알림 채널을 고유하게 식별하는 id 속성 문자열입니다. 범용 고유 식별자(UUID) 또는 이와 유사한 고유 문자열을 사용하는 것이 좋습니다. 최대 길이: 64자(영문 기준)

    설정한 ID 값은 이 채널에 대해 수신하는 모든 알림 메시지의 X-Goog-Channel-Id HTTP 헤더에 다시 에코됩니다.

  • web_hook 값으로 설정된 type 속성 문자열

  • 이 알림 채널의 알림을 수신하고 응답하는 URL로 설정된 address 속성 문자열입니다. 이 URL은 웹훅 콜백 URL이며 HTTPS를 사용해야 합니다.

    웹 서버에 유효한 SSL 인증서가 설치된 경우에만 Directory API에서 이 HTTPS 주소로 알림을 보낼 수 있습니다. 다음 인증서는 유효하지 않습니다.

    • 자체 서명된 인증서
    • 신뢰할 수 없는 출처에서 서명한 인증서
    • 취소된 인증서
    • 인증서의 주체가 대상 호스트 이름과 일치하지 않음

선택 속성

watch 요청을 통해 이러한 선택적 필드를 지정할 수도 있습니다.

  • 채널 토큰으로 사용할 임의의 문자열 값을 지정하는 token 속성입니다. 알림 채널 토큰은 다양한 용도로 사용할 수 있습니다. 예를 들어 토큰을 사용하여 각 수신 메시지가 애플리케이션에서 만든 채널용인지 확인하거나(알림이 스푸핑되지 않도록) 이 채널의 목적에 따라 애플리케이션 내의 올바른 대상으로 메시지를 라우팅할 수 있습니다. 최대 길이: 256자(영문 기준)

    토큰은 애플리케이션이 이 채널과 관련하여 수신하는 모든 알림 메시지의 X-Goog-Channel-Token HTTP 헤더에 포함됩니다.

    알림 채널 토큰을 사용하는 경우 다음을 수행하는 것이 좋습니다.

    • URL 쿼리 매개변수와 같은 확장 가능한 인코딩 형식을 사용합니다. 예: forwardTo=hr&createdBy=mobile

    • OAuth 토큰과 같은 민감한 정보는 포함하지 마세요.

  • Directory API에서 이 알림 채널의 메시지 전송을 중지할 날짜 및 시간의 Unix 타임스탬프(밀리초)로 설정된 expiration 속성 문자열입니다.

    채널에 만료 시간이 있는 경우 애플리케이션이 이 채널과 관련하여 수신하는 모든 알림 메시지에 X-Goog-Channel-Expiration HTTP 헤더 (사람이 읽을 수 있는 형식) 값으로 포함됩니다.

요청에 대한 자세한 내용은 API 참조에서 Users 리소스의 watch 메서드를 참조하세요.

대답 보기

watch 요청이 알림 채널을 성공적으로 만들면 HTTP 200 OK 상태 코드를 반환합니다.

시계 응답의 메시지 본문에서는 아래 예와 같이 방금 만든 알림 채널에 관한 정보를 제공합니다.

{
  "kind": "api#channel",
  "id": "01234567-89ab-cdef-0123456789ab", // ID you specified for this channel.
  "resourceId": "B4ibMJiIhTjAQd7Ff2K2bexk8G4", // ID of the watched resource.
  "resourceUri": "https://admin.googleapis.com/admin/directory/v1/users?domain=domain&event=event", // Version-specific ID of the watched resource.
  "token": "target=myApp-myFilesChannelDest", // Present only if one was provided.
  "expiration": 1384823632000, // Actual expiration time as Unix timestamp (in ms), if applicable.
}

반환되는 정보에는 요청의 일부로 전송한 속성 외에도 이 알림 채널에서 감시 중인 리소스를 식별하는 resourceIdresourceUri도 포함됩니다.

알림 수신을 중지하려는 경우와 같이 반환된 정보를 다른 알림 채널 작업에 전달할 수 있습니다.

응답에 대한 자세한 내용은 API 참조에서 Users 리소스의 watch 메서드를 참조하세요.

메시지 동기화

리소스를 감시하기 위해 알림 채널을 만든 후 Directory API는 알림이 시작됨을 나타내는 sync 메시지를 보냅니다. 이러한 메일의 X-Goog-Resource-State HTTP 헤더 값은 sync입니다. 네트워크 타이밍 문제로 인해 watch 메서드 응답을 수신하기 전에도 sync 메시지를 수신할 수 있습니다.

sync 알림을 무시해도 괜찮지만 사용할 수도 있습니다. 예를 들어 채널을 유지하지 않으려면 통화에서 X-Goog-Channel-IDX-Goog-Resource-ID 값을 사용하여 알림 수신을 중지할 수 있습니다. 또한 이후 이벤트를 준비하기 위해 sync 알림을 사용하여 초기화를 실행할 수도 있습니다.

다음은 Directory API가 수신 URL로 전송하는 sync 메시지의 형식입니다.

POST https://mydomain.com/notifications // Your receiving URL.
X-Goog-Channel-ID: channel-ID-value
X-Goog-Channel-Token: channel-token-value
X-Goog-Channel-Expiration: expiration-date-and-time // In human-readable format. Present only if the channel expires.
X-Goog-Resource-ID: identifier-for-the-watched-resource
X-Goog-Resource-URI: version-specific-URI-of-the-watched-resource
X-Goog-Resource-State: sync
X-Goog-Message-Number: 1

동기화 메일의 X-Goog-Message-Number HTTP 헤더 값은 항상 1입니다. 이 채널의 이후 각 알림에는 이전보다 큰 메시지 번호가 있지만 메시지 번호는 순차적이지 않습니다.

알림 채널 갱신

알림 채널에는 만료 시간이 있으며, 이 값은 사용자 요청 또는 Directory API 내부 한도 또는 기본값에 따라 결정되며 더 제한적인 값이 사용됩니다. 채널의 만료 시간(존재하는 경우)은 watch 메서드에서 반환하는 정보에 Unix 타임스탬프(밀리초 단위)로 포함됩니다. 또한 애플리케이션이 이 채널의 X-Goog-Channel-Expiration HTTP 헤더에 수신하는 모든 알림 메시지에 만료일 및 시간이 사람이 읽을 수 있는 형식으로 포함됩니다.

현재 알림 채널을 자동으로 갱신하는 방법은 없습니다. 채널이 만료에 가까워지면 watch 메서드를 호출하여 채널을 새 채널로 바꿔야 합니다. 항상 그렇듯이 새 채널의 id 속성에 고유한 값을 사용해야 합니다. 동일한 리소스의 두 알림 채널이 활성 상태이면 '겹치는' 기간이 발생할 수 있습니다.

알림 수신

감시한 리소스가 변경될 때마다 애플리케이션이 변경사항을 설명하는 알림 메시지를 수신합니다. Directory API는 이러한 메시지를 이 알림 채널의 address 속성으로 지정한 URL에 HTTPS POST 요청으로 전송합니다.

알림 메시지 형식 해석

모든 알림 메시지에는 X-Goog- 프리픽스가 있는 HTTP 헤더 집합이 포함됩니다. 일부 알림 유형에는 메시지 본문도 포함될 수 있습니다.

헤더

Directory API가 수신 URL에 게시하는 알림 메시지에는 다음 HTTP 헤더가 포함됩니다.

헤더 설명
항상 표시
X-Goog-Channel-ID 이 알림 채널을 식별하기 위해 제공한 UUID 또는 기타 고유한 문자열입니다.
X-Goog-Message-Number 이 알림 채널의 메시지를 식별하는 정수입니다. sync 메시지의 경우 값은 항상 1입니다. 메시지 번호는 채널에서 이후 메시지가 발생할 때마다 증가하지만 순차적이지 않습니다.
X-Goog-Resource-ID 감시한 리소스를 식별하는 불투명 값입니다. 이 ID는 API 버전 간에 안정적입니다.
X-Goog-Resource-State 알림을 트리거한 새 리소스 상태입니다. 가능한 값은 sync 또는 이벤트 이름입니다.
X-Goog-Resource-URI 감시한 리소스의 API 버전별 식별자입니다.
가끔 발표
X-Goog-Channel-Expiration 사람이 읽을 수 있는 형식으로 표시되는 알림 채널 만료 날짜 및 시간입니다. 정의된 경우에만 존재합니다.
X-Goog-Channel-Token 애플리케이션에서 설정했으며 알림 소스를 확인하는 데 사용할 수 있는 알림 채널 토큰입니다. 정의된 경우에만 존재합니다.

사용자에 대한 알림 메시지의 요청 본문에는 다음 정보가 포함됩니다.

속성 설명
kind 이를 사용자 리소스로 식별합니다. 값은 고정 문자열 'admin#directory#user'입니다.
id 사용자 리소스의 고유 식별자입니다.
etag 알림 메시지의 ETag입니다. 사용자 리소스의 ETag와 다릅니다.
primaryEmail 사용자의 기본 이메일 주소입니다.

User 리소스 이벤트의 알림 메시지는 일반적인 형식입니다.

POST https://mydomain.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 0
X-Goog-Channel-ID: directoryApiId
X-Goog-Channel-Token: 398348u3tu83ut8uu38
X-Goog-Channel-Expiration: Tue, 29 Oct 2013 20:32:02 GMT
X-Goog-Resource-ID:  ret08u3rv24htgh289g
X-Goog-Resource-URI: 'https://admin.googleapis.com/admin/directory/v1/users?domain=domain&event=event
X-Goog-Resource-State:  event
X-Goog-Message-Number: 10

{
  "kind": "admin#directory#user",
  "id": long,
  "etag": string,
  "primaryEmail": string
}

사용자 삭제 이벤트의 예는 다음과 같습니다.

POST https://mydomain.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 189
X-Goog-Channel-ID: deleteChannel
X-Goog-Channel-Token: 245t1234tt83trrt333
X-Goog-Channel-Expiration: Mon, 09 Dec 2013 22:24:23 GMT
X-Goog-Resource-ID:  B4ibMJiIhTjAQd7Ff2K2bexk8G4
X-Goog-Resource-URI: https://admin.googleapis.com/admin/directory/v1/users?domain=mydomain.com&event=delete&alt=json
X-Goog-Resource-State:  delete
X-Goog-Message-Number: 236440

{
  "kind": "admin#directory#user",
  "id": "111220860655841818702",
  "etag": "\"Mf8RAmnABsVfQ47MMT_18MHAdRE/evLIDlz2Fd9zbAqwvIp7Pzq8UAw\"",
  "primaryEmail": "user@mydomain.com"
}

알림에 대한 응답

성공을 나타내기 위해 200, 201, 202, 204, 102 상태 코드 중 하나를 반환할 수 있습니다.

서비스가 Google의 API 클라이언트 라이브러리를 사용하고 500, 502, 503 또는 504를 반환하면 Directory API는 지수 백오프로 다시 시도합니다. 다른 모든 반환 상태 코드는 메시지 실패로 간주됩니다.

알림 중지

expiration 속성은 알림이 자동으로 중지되는 시점을 제어합니다. 다음 URI에서 stop 메서드를 호출하여 특정 채널의 알림이 만료되기 전에 수신을 중지할 수 있습니다.

https://www.googleapis.com/admin/directory_v1/channels/stop

이 메서드를 사용하려면 아래 예와 같이 최소한 채널의 idresourceId 속성을 제공해야 합니다. Directory API에 watch 메서드가 있는 여러 유형의 리소스가 있는 경우 stop 메서드는 하나만 있습니다.

적절한 권한을 가진 사용자만 채널을 중지할 수 있습니다. 구체적인 방법은 다음과 같습니다.

  • 일반 사용자 계정으로 채널을 만든 경우 채널을 만든 같은 클라이언트의 동일한 사용자 (인증 토큰의 OAuth 2.0 클라이언트 ID로 식별됨)만 채널을 중지할 수 있습니다.
  • 서비스 계정으로 채널을 만든 경우 동일한 클라이언트의 모든 사용자가 채널을 중지할 수 있습니다.

다음 코드 샘플은 알림 수신을 중지하는 방법을 보여줍니다.

POST https://www.googleapis.com/admin/directory_v1/channels/stop
  
Authorization: Bearer CURRENT_USER_AUTH_TOKEN
Content-Type: application/json

{
  "id": "4ba78bf0-6a47-11e2-bcfd-0800200c9a66",
  "resourceId": "ret08u3rv24htgh289g"
}