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.