Google push-уведомления - неавторизованный канал обратного вызова WebHook

Я столкнулся с проблемой с push-уведомлениями Google (для диска). Я использую служебную учетную запись, которая отлично работает для всех других операций с приводом, за исключением просмотра изменений.

Ниже приведен код приложения, который теперь завершился неудачей с исключением "Unauthorized WebHook callback channel". Я также сбрасывал запросы и ответы, которые генерируются при вызове drive.changes.watch.execute.

Адрес целевого уведомления включен в API и панель управления Push Push (я даже перечислял его в источниках и источниках Javascript), и теперь я застрял в этой ошибке 401 Unauthorized.

Кто-нибудь знает, где я ошибаюсь? Спасибо за любую помощь.

PrivateKey serviceAccountPrivateKey = SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(), p12File, "notasecret", "privatekey", "notasecret");
JsonFactory jsonFactory = new JacksonFactory();
HttpTransport t = GoogleNetHttpTransport.newTrustedTransport();
GoogleCredential gc = new GoogleCredential.Builder()
                .setTransport(t)
                .setJsonFactory(jsonFactory)
                .setServiceAccountScopes(Collections.singleton(DriveScopes.DRIVE))
                .setServiceAccountPrivateKey(serviceAccountPrivateKey)
                .setServiceAccountId(Config.SERVICE_ACCOUNT_ID)
                .setServiceAccountUser(Config.SERVICE_ACCOUNT_USER)
                .build();

drive = new Drive.Builder(t, jsonFactory, null).setHttpRequestInitializer(gc).setApplicationName(cfg.getStringParam(Config.GAE_APPLICATION_NAME)).build();

// THIS WORKS
Changes.List request = drive.changes().list();
ChangeList changes = request.execute();

// THIS DOES NOT WORK
Channel channel = new Channel();
channel.setId(UUID.randomUUID().toString());
channel.setType("web_hook");
channel.setAddress(Config.PUSH_NOTIFICATION_ADDRESS);
Channel c = drive.changes().watch(channel).execute();


-------------- REQUEST  --------------
POST https://www.googleapis.com/drive/v2/changes/watch
Accept-Encoding: gzip
Authorization: Bearer XXX
User-Agent: XXX Google-HTTP-Java-Client/1.17.0-rc (gzip)
Content-Type: application/json; charset=UTF-8
Content-Length: 118

CONFIG: curl -v --compressed -X POST -H 'Accept-Encoding: gzip' -H 'Authorization: Bearer XXX' -H 'User-Agent: XXX Google-HTTP-Java-Client/1.17.0-rc (gzip)' -H 'Content-Type: application/json; charset=UTF-8' -d '@-' -- 'https://www.googleapis.com/drive/v2/changes/watch' << $$$
CONFIG: {"address":"XXX","id":"8078114c-fba0-44e7-a34c-cb391ea40061","type":"web_hook"}

-------------- RESPONSE --------------
401 OK
www-authenticate: Bearer realm="https://accounts.google.com/AuthSubRequest", error=invalid_token

-------------- REQUEST  --------------
POST https://accounts.google.com/o/oauth2/token

-------------- RESPONSE --------------
200 OK
{
  "access_token" : XXX,
  "token_type" : "Bearer",
  "expires_in" : 3600
}

-------------- REQUEST  --------------
POST https://www.googleapis.com/drive/v2/changes/watch

-------------- RESPONSE --------------
401 OK
www-authenticate: Bearer realm="https://accounts.google.com/AuthSubRequest", error=invalid_token

...
...
...

-------------- RESPONSE --------------
200 OK
content-type: application/json; charset=utf-8
cache-control: no-cache, no-store, max-age=0, must-revalidate
pragma: no-cache
expires: Fri, 01 Jan 1990 00:00:00 GMT
date: Wed, 28 May 2014 20:51:19 GMT
content-disposition: attachment; filename="json.txt"; filename*=UTF-8''json.txt
content-encoding: gzip
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
server: GSE
alternate-protocol: 443:quic
transfer-encoding: chunked

{
  "access_token" : XXX,
  "token_type" : "Bearer",
  "expires_in" : 3600
}

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "push.webhookUrlUnauthorized",
    "message": "Unauthorized WebHook callback channel: XXX"
   }
  ],
  "code": 401,
  "message": "Unauthorized WebHook callback channel: XXX"
 }
}

Ответ 1

Вы должны добавить свой домен в консоль разработчиков.

Как сделать:

  • Войдите в Консоль разработчиков Google
  • Выберите свой проект
  • В разделе "APIS и AUTH" выберите "Push"
  • Нажмите "Добавить домены"
  • Введите необходимые домены (требуется только домен, а не весь URL-адрес уведомления)
  • Нажмите кнопку "Добавить домены"

После этого он должен работать, если нет ничего плохого в том, что вы делаете: p

Ответ 2

Для меня, как я добавил выше,

Проверка домена не была сохранена в консоли разработчика Google (обновите страницу, и она исчезла). В конечном итоге проблема закончилась тем, что я зарегистрировался как две учетные записи google, моя учетная запись gmail и учетная запись моей компании. Добавление проверки домена, похоже, путалось с учетной записью и не сохраняло настройки домена.

Попробуйте войти в систему, используя другой браузер или сеанс инкогнито, если вы используете несколько учетных записей google.

Ответ 3

Для меня я хотел, чтобы URL-адрес обратного вызова был https://test-apis.domain.io. Поэтому для проверки домена я добавил test-apis.domain.io а затем попытался изменить запись TXT, но он никогда не работал (проверял).

Наконец, закончил проверку только domain.io тем же методом. После этого я смог добавить домен test-apis.domain.io на экране "Проверка домена". Надеюсь, это тоже поможет другим.

Ответ 4

Я подтвердил свой домен, проверил мой SSL, но проблема не исчезла.

Наконец, я нашел решение: используйте ключ сервиса Acconut в Google Developers Console (а не ключ API, а не идентификатор клиента OAuth).

Ответ 5

Так что это все из-за настроек на console.developers.google.com. Вам необходимо добавить свой внутренний домен к обоим авторизированным доменам (вкладка "Экран согласия на согласие") и "Допустимые домены" (на вкладке "Проверка домена").

Поэтому причина в том, что теперь это работает для вас, заключается в том, что, вероятно, вы подтвердили и добавили свой домен верхнего уровня уже в то время, когда ваша локальная среда имела отдельный домен (а не субдомен подтвержденного верхнего уровня) в то время, особенно если вы были подвергая ваш локальный сервер в Интернете.