Подтвердить что ты не робот

Как мы можем проверить, установлено ли наше приложение для некоторых организаций, но не для всех?

Мы создали приложение для 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, приложение может быть включено для всех, для выбранных организаций или отключено. Нам нужно знать статус нашего приложения.

в приложениях " Marketplace apps

Обновление 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
4b9b3361

Ответ 1

Не уверен, но, возможно, нашел способ. Из документации я утверждал, что доступ к домену необходим для олицетворения пользователя в целевом домене. Сервисные приложения не нужны для других задач. Если вы запутались, вы можете проверить, получаете ли вы учетные данные без подпараметра SignedJwtAssertionCredentials. Если это удастся, но добавление вспомогательного параметра завершается с ошибкой, вы устанавливаете его, но не в домене.

Сообщите нам, если это работает, и, очевидно, у Google есть еще некоторая работа.

Ответ 2

Вы можете добавить ping назад, каждый час или около того вызывать некоторую конечную точку. Если ping был слишком давно, они, вероятно, удалили приложение