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.
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
Spiegare in dettaglio cosa significa "installato per un'organizzazione"! –
@KlausD. Si prega di vedere la mia domanda aggiornata. L'aggiornamento – Uri
non lo rende chiaro. – Psytho