Notifiche push di Google: canale di callback WebHook non autorizzato

Sto riscontrando problemi con le notifiche push di Google (per l’unità). Uso l’account di servizio che funziona perfettamente per tutte le altre operazioni di guida, ad eccezione delle modifiche di guida.

Di seguito è riportato il codice dell’applicazione che ora non funziona con l’eccezione “Canale di richiamata WebHook non autorizzato”. Ho anche scaricato richieste e risposte generate quando viene chiamato drive.changes.watch.execute.

L’indirizzo di notifica di destinazione è nella whitelist nelle API e nel pannello di controllo di push Push (lo elenco anche in origini e referrer Javascript) e ora sono bloccato con questo errore 401 non autorizzato.

Qualcuno sa dove sto sbagliando? Grazie per qualsiasi aiuto.

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" } } 

Devi aggiungere il tuo dominio alla console degli sviluppatori.

Come:

  1. Accedi alla Google Developers Console
  2. Seleziona il tuo progetto
  3. Sotto ‘APIS & AUTH’ seleziona ‘Push’
  4. Fai clic su “Aggiungi domini”
  5. Inserisci i domini necessari (è necessario solo il dominio, non l’intero URL di notifica)
  6. Fai clic sul pulsante “Aggiungi domini”

Dopodiché dovrebbe funzionare a meno che non ci sia qualcos’altro che non va in quello che stai facendo: p

Per me, come ho messo in un commento sopra,

La verifica del dominio non stava salvando nella console per sviluppatori di Google (aggiorna la pagina e non c’era più). Il problema alla fine è stato il fatto di essere stato registrato come due account Google, il mio account Gmail e il mio account aziendale. L’aggiunta della verifica del dominio sembrava confondersi con l’account e non salvare le impostazioni del dominio.

Prova ad accedere utilizzando un browser diverso o una sessione in incognito se utilizzi più account Google.

Per quanto mi riguarda, volevo l’URL del webhook di callback come https://test-apis.domain.io . Quindi per la verifica del dominio, ho aggiunto test-apis.domain.io e poi ho provato a modificare il record TXT ma non funzionava mai (convalida).

Alla fine domain.io finito per verificare solo domain.io con lo stesso metodo. Dopo averlo fatto, sono stato in grado di aggiungere il dominio test-apis.domain.io nella schermata “Verifica dominio” delle credenziali. Spero che questo aiuti anche gli altri.