Мы создали приложение для Google Apps Marketplace. Наше приложение работает только в том случае, если оно установлено для всех. Но проблема в том, что некоторые клиенты устанавливают наше приложение для некоторых организаций, а не для всех. Мы хотим отобразить конкретное сообщение для этих клиентов, но проблема в том, что мы не знаем, установлено ли наше приложение для некоторых организаций или вообще не установлено. Поэтому клиенты, которые установили наше приложение для некоторых организаций, получают сообщение, предназначенное для клиентов, которые вообще не устанавливали наше приложение. Мы показываем им кнопку установки, но ничего не происходит, когда они устанавливают наше приложение снова, потому что оно уже установлено. Мы хотим дать им инструкции, как изменить статус нашего приложения на "для всех".
Как мы можем проверить, установлено ли наше приложение для некоторых организаций? Мы получаем следующее сообщение об ошибке от Google:
Failed to retrieve access token: {
"error" : "unauthorized_client",
"error_description" : "Unauthorized client or scope in request."
}
Это то же сообщение об ошибке, которое мы получаем для cutomers, которые вообще не устанавливали наше приложение.
Это функция Python, которая генерирует исключение:
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)
Обновление 1: в приложениях > Приложения Marketplace, приложение может быть включено для всех, для выбранных организаций или отключено. Нам нужно знать статус нашего приложения.
Обновление 2: Я попытался позвонить check_general_access
, но также, когда наше приложение удалено, мы получаем True (приложение имеет общий доступ). Это после того, как мы подтвердили, что check_access
возвращается 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 domain" % (admin_email))
return True
except Exception as e:
logging.info("Application does not have access to admin %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