gsuite google create python google-apps google-apps-marketplace

python - google - ¿Cómo podemos verificar si nuestra aplicación está instalada para algunas organizaciones pero no para todas?



google api create account (2)

No estoy seguro, pero puede haber encontrado una manera. De la documentación afirmé que se necesita acceso a todo el dominio para hacerse pasar por un usuario dentro del dominio de destino. Las aplicaciones de servicio no necesitan esto para otras tareas. Mientras está enrevesado, puede probar si obtiene credenciales sin el subparámetro para SignedJwtAssertionCredentials. Si esto tiene éxito, pero la adición del parámetro secundario falla, está instalado pero no en todo el dominio.

Háganos saber si esto funciona y, obviamente, Google todavía tiene trabajo que hacer allí.

Creamos una aplicación para Google Apps Marketplace. Nuestra aplicación funciona solo si está instalada para todos. Pero el problema es que algunos clientes instalan nuestra aplicación para algunas organizaciones, no para todos. Queremos mostrar un mensaje específico a esos clientes, pero el problema es que no sabemos si nuestra aplicación está instalada para algunas organizaciones o si no está instalada. Por lo tanto, los clientes que instalaron nuestra aplicación para algunas organizaciones reciben un mensaje destinado a los clientes que no instalaron nuestra aplicación en absoluto. Les mostramos el botón de instalación, pero no pasa nada cuando vuelven a instalar nuestra aplicación, porque ya está instalada. Queremos darles instrucciones sobre cómo cambiar el estado de nuestra aplicación a "para todos".

¿Cómo podemos verificar si nuestra aplicación está instalada para algunas organizaciones? Recibimos el siguiente mensaje de error de Google:

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

Este es el mismo mensaje de error que recibimos para los usuarios que no instalaron nuestra aplicación.

Esta es la función de Python que lanza la excepción:

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)

Actualización 1: en Aplicaciones> Aplicaciones de Marketplace, una aplicación puede estar activada para todos, activada para organizaciones seleccionadas o desactivada. Necesitamos saber el estado de nuestra aplicación.

Actualización 2: traté de llamar a check_general_access pero también cuando desinstalamos nuestra aplicación, recibimos True (la aplicación tiene acceso general). Esto es después de que confirmamos que check_access devolvió 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


Puede agregar ping de vuelta, cada hora o así llamar a algún punto final. Si el ping fue hace mucho tiempo, probablemente eliminen la aplicación.