2015-10-04 14 views
25

Abbiamo creato un'applicazione per Google Apps Marketplace. La nostra app funziona solo se è installata per tutti. Ma il problema è che alcuni clienti installano la nostra app per alcune organizzazioni, non per tutti. Vogliamo mostrare un messaggio specifico a quei clienti, ma il problema è che non sappiamo se la nostra app è installata per alcune organizzazioni o non è installata affatto. Pertanto, i clienti che hanno installato la nostra app per alcune organizzazioni ricevono un messaggio destinato ai clienti che non hanno installato la nostra app. Mostriamo loro il pulsante di installazione, ma non succede nulla quando installano nuovamente la nostra app, perché è già installata. Vogliamo dare loro istruzioni su come modificare lo stato della nostra app su "on per tutti".Come possiamo verificare se la nostra app è installata per alcune organizzazioni ma non tutte?

Come possiamo verificare se la nostra app è installata per alcune organizzazioni? Otteniamo il seguente messaggio di errore da Google:

Failed to retrieve access token: { 
    "error" : "unauthorized_client", 
    "error_description" : "Unauthorized client or scope in request." 
} 

Che è lo stesso messaggio di errore che riceviamo per cutomers che non installano la nostra applicazione a tutti.

Questa è la funzione Python che genera l'eccezione:

def _do_refresh_request(self, http_request): 
    """Refresh the access_token using the refresh_token. 

    Args: 
     http_request: callable, a callable that matches the method signature of 
     httplib2.Http.request, used to make the refresh request. 

    Raises: 
     AccessTokenRefreshError: When the refresh fails. 
    """ 
    body = self._generate_refresh_request_body() 
    headers = self._generate_refresh_request_headers() 

    logger.info('Refreshing access_token') 
    resp, content = http_request(
     self.token_uri, method='POST', body=body, headers=headers) 
    if resp.status == 200: 
     # TODO(jcgregorio) Raise an error if loads fails? 
     d = simplejson.loads(content) 
     self.token_response = d 
     self.access_token = d['access_token'] 
     self.refresh_token = d.get('refresh_token', self.refresh_token) 
     if 'expires_in' in d: 
     self.token_expiry = datetime.timedelta(
      seconds=int(d['expires_in'])) + datetime.datetime.utcnow() 
     else: 
     self.token_expiry = None 
     if self.store: 
     self.store.locked_put(self) 
    else: 
     # An {'error':...} response body means the token is expired or revoked, 
     # so we flag the credentials as such. 
     logger.info('Failed to retrieve access token: %s' % content) 
     error_msg = 'Invalid response %s.' % resp['status'] 
     try: 
     d = simplejson.loads(content) 
     if 'error' in d: 
      error_msg = d['error'] 
      self.invalid = True 
      if self.store: 
      self.store.locked_put(self) 
     except StandardError: 
     pass 
     raise AccessTokenRefreshError(error_msg) 

Update 1: in Applicazioni> Applicazioni di Marketplace, un'applicazione può essere di per tutti, su per le organizzazioni selezionate o spento. Dobbiamo conoscere lo stato della nostra app.

in Apps > Marketplace apps

Update 2: Ho provato a chiamare check_general_access, ma anche quando la nostra applicazione viene disinstallata riceviamo True (applicazione ha accesso generale). Questo è dopo che abbiamo confermato che check_access ha restituito False.

@staticmethod 
def check_access(admin_email): 
    http = httplib2.Http() 
    credentials = SignedJwtAssertionCredentials(
     SERVICE_EMAIL, 
     PRIVATE_KEY, 
     scope='https://apps-apis.google.com/a/feeds/emailsettings/2.0/ https://www.googleapis.com/auth/admin.directory.user.readonly', 
     sub=str(admin_email), 
    ) 
    http = credentials.authorize(http) 
    try: 
     service = build(serviceName='admin', version='directory_v1', http=http) 
     logging.info("Application has access to admin's %s domain" % (admin_email)) 
     return True 
    except Exception as e: 
     logging.info("Application does not have access to admin's %s domain (exception: %s)" % (admin_email, e.message)) 
     return False 

@staticmethod 
def check_general_access(): 
    http = httplib2.Http() 
    credentials = SignedJwtAssertionCredentials(
     SERVICE_EMAIL, 
     PRIVATE_KEY, 
     scope='https://apps-apis.google.com/a/feeds/emailsettings/2.0/ https://www.googleapis.com/auth/admin.directory.user.readonly', 
    ) 
    http = credentials.authorize(http) 
    try: 
     service = build(serviceName='admin', version='directory_v1', http=http) 
     logging.info("Application has general access") 
     return True 
    except Exception as e: 
     logging.info("Application does not have general access (exception: %s)" % e.message) 
     return False 
+1

Spiegare in dettaglio cosa significa "installato per un'organizzazione"! –

+0

@KlausD. Si prega di vedere la mia domanda aggiornata. L'aggiornamento – Uri

+1

non lo rende chiaro. – Psytho

risposta

-1

È possibile aggiungere il ping indietro, ogni ora circa chiama un punto finale. Se il ping era troppo tempo fa probabilmente rimuovono l'app

+0

Vogliamo verificare in un momento specifico qual è lo stato della nostra app: "on for everyone", "on for selected orgs" o "off". Non capisco cosa intendi con "ping back" e "call end point", per favore sii più specifico. – Uri

+0

È possibile utilizzare https://developers.google.com/cloud-messaging/ Ci sono due modi per implementare ciò che vuoi con GCM. Se si utilizza la connessione HTTP più semplice al server GCM, il server invia una richiesta HTTP al server GCM, che consegna il messaggio al dispositivo. Il dispositivo deve creare la propria connessione al server per inviare i dati al server (eseguire il ping al server). – usearch

+0

Desidero sapere quale messaggio posso inviare a Google per determinare come viene installata (o non installata) la nostra app. Sto cercando una risposta specifica. Ho visto il link che hai menzionato e non ho trovato la risposta lì. Si prega di notare che la nostra app non è per Android o iOS, ma per le app di Google. – Uri

1

Non sono sicuro, ma potrebbe aver trovato un modo. Dalla documentazione ho affermato che è necessario l'accesso a livello di dominio per impersonare un utente all'interno del dominio di destinazione. Le app di servizio non hanno bisogno di questo per altre attività. Mentre è convoluto, è possibile verificare se si ottengono le credenziali senza il parametro secondario su SignedJwtAssertionCredentials. Se questo riesce, ma l'aggiunta del parametro secondario fallisce, sei installato ma non a livello di dominio.

Facci sapere se questo funziona e ovviamente Google ha del lavoro da fare lì ancora.

+0

Grazie per la risposta, ma non funziona. Si prega di vedere il mio secondo aggiornamento. – Uri

Problemi correlati