4

単一のドライブアカウントにログインし、cronジョブを使用してファイルに対して操作を自動的に実行する必要があるアプリケーションがあります。最初は、ドメイン管理者ログインを使用してこれを実行しようとしましたが、ドメイン管理者アカウントでテストサーバーを使用できないようで、アプリケーションのテストが少し不可能であるため、ドメイン管理者でテストを実行できません。 !!

そのため、初期設定後にこのアカウントに自動的にログインするために、任意のoauthトークン(特に更新トークン)の保存を検討し始めました。ただし、すべてのAPIとドキュメントは、複数の個々のユーザーが手動でログインしていることを前提としており、現在ログインしているユーザー以外へのログインを許可または説明する機能がoauthAPIに見つかりません。

テストドメインでコードをテストできる方法でこれを実現するにはどうすればよいですか?独自のoauthライブラリを作成したり、oauthリクエストを手動で実行したりせずにそれを行うことはできますか?または、ドメイン管理者の承認をローカルテストサーバーで機能させる方法はありますか?

4

2 に答える 2

5

リモートAPIを使用して、単一のアカウントのクレデンシャルをデータストアにロードできます。リモートAPIapp.yamlは、ファイルで有効にできます。

builtins:
- remote_api: on

実行することにより

remote_api_shell.py -s your_app_id.appspot.com

コマンドラインから、アプリケーションの環境で実行できるシェルにアクセスできます。これを行う前に、アプリケーションがデプロイされていることを確認し(ローカル開発については以下で詳しく説明します)、アプリケーションをインストールして実行し、AppEngineプロジェクトに追加することでソースgoogle-api-python-clientが含まれていることを確認します。pipenable-app-engine-project /path/to/project

リモートシェルに入ったら(上記のリモートコマンドを実行した後)、次の手順を実行します。

from oauth2client.appengine import CredentialsModel
from oauth2client.appengine import StorageByKeyName
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run

KEY_NAME = 'your_choice_here'
CREDENTIALS_PROPERTY_NAME = 'credentials'
SCOPE = 'https://www.googleapis.com/auth/drive'

storage = StorageByKeyName(CredentialsModel, KEY_NAME, CREDENTIALS_PROPERTY_NAME)
flow = OAuth2WebServerFlow(
    client_id=YOUR_CLIENT_ID,
    client_secret=YOUR_CLIENT_SECRET,
    scope=SCOPE)

run(flow, storage)

注:google-api-python-clientコードを使用してアプリケーションをデプロイしていない場合、アプリケーションはローカルマシンで行ったのと同じインポートを行う方法を認識しないため、失敗しますfrom oauth2client.appengine import CredentialsModel

run呼び出されると、Webブラウザーが開き、指定したクライアントのOAuthアクセスを受け入れるように求められます。正常に完了するCLIENT_IDと、デプロイされたアプリケーションのデータストアにCLIENT_SECRETインスタンスが保存され、あなたが提供した。CredentialsModelyour_app_id.appspot.comKEY_NAME

これを行った後、アプリケーション内のすべての呼び出し元(cronジョブを含む)は、実行することでこれらの資格情報にアクセスできます。

storage = StorageByKeyName(CredentialsModel, KEY_NAME, CREDENTIALS_PROPERTY_NAME)
credentials = storage.get()

ローカル開発:

これをローカルでテストする場合は、dev_appserver.py --port = PORT / path / to/projectを介してアプリケーションをローカルで実行できます。

また、リモートAPIシェルを使用して同じコマンドを実行し、ローカルアプリケーションにポイントすることができます。

remote_api_shell.py -s localhost:PORT

ここで、リモートAPIシェルで実行したのと同じコードを実行できます。同様に、のインスタンスがCredentialsModelローカル開発サーバーのデータストアに保存されます。

上記のように、正しいgoogle-api-python-clientモジュールが含まれていない場合、これは失敗します。

編集:これは、次の場所でインタラクティブコンソールの使用を推奨するために使用されていました:

http://localhost:PORT/_ah/admin/interactive

socketただし、App Engineローカル開発サンドボックスでは正しく機能しないため、これは機能しないことが判明しました。

于 2012-11-17T02:40:53.217 に答える
3

この記事では、ドメイン管理者にドメイン全体の権限をサービスアカウントに委任させることにより、ドメインのユーザーに代わってGoogleドライブを操作する方法について説明します。

この別の記事では、サービスアカウントを使用してアプリケーションが所有するドライブを操作する方法について説明します。

どちらの方法もJWTベースのサービスアカウントを使用しており、AppEngineで動作させるには現在google-api-python-clientの変更バージョンが必要であることに注意してください。

Google App Engineサービスアカウントとは異なり、JWTベースのサービスアカウントは開発サーバーと連携する必要があります。

于 2012-11-17T02:51:20.540 に答える