2015-10-04 8 views
25

Google Apps Marketplaceのアプリケーションを作成しました。私たちのアプリは誰にでもインストールされている場合にのみ動作します。しかし、問題は、一部の顧客が一部の組織ではなく誰でもアプリケーションをインストールするということです。それらの顧客に特定のメッセージを表示したいのですが、問題は、アプリが一部の組織にインストールされているか、インストールされていないかわからないことです。したがって、いくつかの組織のために私たちのアプリをインストールした顧客は、私たちのアプリを全くインストールしなかった顧客を対象としたメッセージを受け取ります。インストールボタンを表示しますが、既にインストールされているため、アプリを再インストールすると何も起こりません。アプリのステータスを「すべてのユーザーのために」変更する方法を指示します。アプリが一部の組織でインストールされているかどうかは確認できますか?

一部の組織でアプリがインストールされているかどうか調べるにはどうすればよいですか?

我々は全く我々のアプリをインストールしていないcutomersのために受信、同じエラーメッセージです
Failed to retrieve access token: { 
    "error" : "unauthorized_client", 
    "error_description" : "Unauthorized client or scope in request." 
} 

:私たちは、Googleからの次のエラーメッセージが表示されます。

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アプリ、アプリがオフの選択ORGSまたはのために、皆のためにすることができ

これは、例外をスローするPythonの関数です。アプリのステータスを知る必要があります。

in Apps > Marketplace apps

アップデート2:私はcheck_general_access私たちのアプリケーションがアンインストールされたときにも、我々は(アプリケーションの一般的なアクセス権を持っている)真の受信を呼び出してみました。これは、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 %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 
+1

「組織向けにインストールされた」とは、具体的に説明してください! @KlausD。 –

+0

更新された質問をご覧ください。 – Uri

+1

更新はそれを明確にしません。 – Psytho

答えて

-1

pingを追加したり、1時間ごとにエンドポイントを呼び出すことができます。 pingが長すぎる場合は、おそらくアプリを削除します。

+0

私たちのアプリのステータスは「全員がオン」、「選択された組織はオン」、「オフ」となっています。私はあなたが "ping back"と "end pointを呼ぶ"という意味を理解していません。具体的にしてください。 – Uri

+0

https://developers.googleを使用できます。com/cloud-messaging/ GCMで必要なものを実装するには2通りの方法があります。 GCMサーバーへのより簡単なHTTP接続を使用すると、サーバーからHTTPリクエストがGCMサーバーに送信され、GCMサーバーはそのメッセージをデバイスに配信します。デバイスは、サーバーにデータを送信するためにサーバーとの独自の接続を作成する必要があります(サーバーにpingを戻す)。 – usearch

+0

アプリのインストール方法を決定するためにGoogleに送信できるメッセージを知りたい。私は特定の答えを探しています。私があなたが言及したリンクを見ました。私は答えを見つけられませんでした。私たちのアプリはAndroidやiOS用ではなく、Googleアプリ用であることに注意してください。 – Uri

1

わかりませんが、方法が見つかった可能性があります。ドキュメントから、ターゲットドメイン内のユーザーを偽装するためにドメイン全体のアクセスが必要であると主張しました。サービスアプリはこれを他のタスクに必要としません。畳み込まれている間、サブパラメータなしで資格情報をSignedJwtAssertionCredentialsに取得するかどうかをテストできます。これが成功したが、サブパラメータを追加すると失敗した場合、インストールされていますがドメイン全体ではありません。

これが機能しているかどうかをGoogleにお知らせください。明らかに、Googleには依然としてそのための作業がいくつかあります。

+0

あなたの答えをありがとうが、それは動作しません。私の2回目の更新を見てください。 – Uri

関連する問題