2015-08-13 19 views
10

Ho un'eccezione molto strana utilizzando l'API di google in python. L'obiettivo è verificare sul lato server la validità di un token corrispondente a una sottoscrizione in-app da un'applicazione Android.API Google restituisce invalid_grant in produzione ma non in locale

Quindi, per fare questo, abbiamo un account di servizio collegato al nostro account Google Play e cerchiamo di Authentify nostra richiesta utilizzando OAuth attraverso la chiave di p12 (convertito in un certificato PEM al fine di rimuovere la passphrase):

from apiclient.discovery import build 
from httplib2 import Http 
from oauth2client.client import SignedJwtAssertionCredentials 

with open("googleplay.pem") as f: 
    private_key = f.read() 
credentials = SignedJwtAssertionCredentials(GOOGLE_CLIENT_EMAIL, private_key, scope=['https://www.googleapis.com/auth/androidpublisher']) 
http_auth = credentials.authorize(Http()) 
client = build('androidpublisher', 'v2', http=http_auth) 

E questo funziona perfettamente sul mio computer. Ma l'ultima riga attiva un'eccezione sui miei server: invalid_grant

Non capisco da dove possa venire! Se puoi aiutarci, sarebbe meraviglioso!

po 'di codice aggiuntivo che ho usato per convertire il certificato di p12 ad un certificato PEM:

openssl pkcs12 -in privatekey.p12 -nodes -nocerts > privatekey.pem 

Poi ho tolto le prime 4 righe.

Grazie in anticipo!

risposta

0

Non sono sicuro se questo ti possa aiutare a darti qualche idea.

Ho risolto un problema con un messaggio di errore simile (contiene anche "invalid_grant"). Il mio caso era dovuto all'assenza del valore refresh_token nelle credenziali OAuth2 che porta all'aggiornamento delle credenziali non riuscite. Quindi la mia correzione era ottenere il nuovo token di aggiornamento da google. Risulta che google distribuisce solo la prima volta che un utente si autorizza con google. A meno che l'utente non scolleghi l'app e reautorizzi. O nell'app, è impostato flow.params['approval_prompt'] = 'force' (in genere per il debug locale).

Il mio caso riguarda le credenziali per l'applicazione Web e l'autorizzazione OAuth2. Il tuo sembra un account di servizio, quindi non sono sicuro che il tuo problema sia un problema di aggiornamento.

+0

Hum grazie, ma io non credo che questo sia rilevante per il mio caso ... In effetti, sto usando un account di servizio e quindi non dovrebbe avere questo problema. :( – arthur

0

Ho avuto esattamente lo stesso problema.

ho riparato sincronizzando il tempo di sistema utilizzando NTP

questo funziona solo su un server principale. Non su un server virtuale. Contatta il tuo server hosting provider se noleggi un vServer.

Spero che questo aiuta :)