2012-07-24 11 views
7

新しいDrive SDKは、認証されたユーザーにとって非常に優れています。 Drive SDK Google Apps管理アクセスを使用して他のドメインユーザーを偽装することは可能ですか?Google Apps管理者は、Drive SDKでユーザーファイルを管理できますか?

doclist APIを使用することはできますが、このツールではファイル(pdf、jpg)の管理やコピーはできません。

私はこのコードを使用してJavaを使用しています:

credential_origine = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
        .setJsonFactory(JSON_FACTORY) 
        .setServiceAccountId("[email from console api]") 
        .setServiceAccountScopes(DriveScopes.DRIVE) 
        .setServiceAccountUser("[email protected]") 
        .setServiceAccountPrivateKeyFromP12File(new File("key.p12")).build(); 

しかし、私は[email protected]のデータを取得しようとすると、私はエラーを取得します。私が.setServiceAccountUser("[email protected]")とコメントすると、コードを作成するのに使ったのと同じアカウントでコードがうまく機能します。

古いDOCList APIでは、リクエストのURLによって別のユーザーを偽装しました。それは何か似ていますか?

+0

どのようなエラーが表示されますか?[ここ](http://support.google.com/a/bin/answer.py?hl=ja&answer=162106)の説明に従って、ドメインのcPanelのAPIコンソールから生成されたクライアントIDを必ず追加してください。 – Alain

+0

こんにちはアラン、それは今うまく動作し、おそらく私は間違っていたServiceAccountUser。私はupdatePermissionとpatchPermissionの両方でファイルの所有者を変更しようとしたときに500内部サーバーエラーが発生します...ファイルには所有者がいる必要があります..ヘルプをお寄せいただきありがとうございます – Ridgh

+0

@Ridghできますadmin SDKを使用してユーザーのドキュメントにアクセスする方法について考えてください。現在私はユーザーのドキュメントに取り組んでいます –

答えて

4

Service Accountsを使用して、アサーションの主張を作成するときに偽装するユーザーを指定できます。

APIプロジェクト(APIs Consoleから)にサービスアカウントキーを作成したら、このプロジェクトをcPanelの認定サードパーティアプリケーションのリストに追加する必要があります。これに関する詳細は、hereを参照してください。 https://www.googleapis.com/auth/drive:あなたは他のユーザーがファイルを管理したいので、あなたが使用する必要が 「クライアントID」はサービスアカウントキーに結合した1つであると<APP_ID>-<OTHER_KEY>.apps.googleusercontent.com

のように見える、あなたはドライブの広い範囲を承認する必要があります。

多くのクライアントライブラリは、開発者のクレーム生成を抽象化します。使用する言語を指定できる場合は、開始に役立つコードスニペットを入力してこの回答を更新できます。

+0

これを達成するためのRubyライブラリはありますか? – tbeseda

+0

Ruby用Googleクライアントライブラリは、サービスアカウントをサポートしています:https://code.google.com/p/google-api-ruby-client/wiki/ServiceAccounts – Alain

0

アップグレード:

コード:

com.google.api.client.googleapis.auth.oauth2.GoogleCredential.Builder credential_origine_builder = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
        .setJsonFactory(JSON_FACTORY) 
        .setServiceAccountId("[[]]") 
        .setServiceAccountScopes(DriveScopes.DRIVE) 
        .setServiceAccountPrivateKeyFromP12File(new File("cfg/file.p12")); 

credential_origine_builder.setServiceAccountUser("[email protected]"); 

が正常に動作します。

我々は、ユーザーの名前やIDを取得するための

.setServiceAccountScopes(DriveScopes.DRIVE,Oauth2Scopes.USERINFO_EMAIL,Oauth2Scopes.USERINFO_PROFILE) 

.setServiceAccountScopes(DriveScopes.DRIVE)を変更した場合は3つのスコープを使用するユーザーのみ「の所有者で正常に動作.setServiceAccountUser("[email protected]");

との互換性がないように思われます"キーの保存...維持する

+0

oAuthアクセスを設定したときにこれらの追加のスコープを許可しましたか? cpanel? Google cpanelヘルプから:各クライアントについて、カンマで区切って複数のAPIを指定できます。たとえば、連絡先とドキュメントリストの両方のAPIにアクセスできるようにするには:「http://www.google.com/m8/feeds/、http://docs.google.com/feeds/「 – David

+0

David、私のコードで私は確かにスコープを追加しました、私はこの範囲を表示していないGoogleのAPIコンソールで、私は間違っていますか?私は、グループ設定apiとプロビジョニングapiとoauth 2.0 Webフローを正しく使用しました。私の質問はdoclist api + drive apiとサービスアカウントOauthの流れです...私はドライブsdkだけを使用したいと思っていますが、許可を管理することはできません(電子メールフィールドはプライバシーのために返されません).. – Ridgh

0

ここではDartlangの完全なコードは、偽装USER @ YOUR_DOMAINのユーザーファイルをJSONキーで一覧表示する

pubspec.yamlで generate JSON key

ダートプロジェクトの依存関係 - :あなたは(認証アピス&>資格情報、プロジェクトのコンテキストで):Google Developer Console を経由して(代わりにP12の)JSONキーを生成する必要があります、それを実行するには

googleapis googleapis_auth非同期)

import 'package:googleapis/drive/v2.dart'; 
import 'package:googleapis_auth/auth_io.dart'; 
import 'package:async/async.dart'; 

final _credentials = new ServiceAccountCredentials.fromJson(r''' 
{ 
    "private_key_id": "*PRIVATE_KEY_ID*", 
    "private_key": "*PRIVATE_KEY_CONTENT*", 
    "client_email": "*[email protected]*", 
    "client_id": "*SOMETHING.apps.googleusercontent.co*m", 
    "type": "service_account" 
} 
''', impersonatedUser: "*[email protected]_DOMAIN*"); //here you type user 

const _SCOPES = const [DriveApi.DriveScope]; 

main() async { 
    var http_client = await clientViaServiceAccount(_credentials, _SCOPES); 
    var drive = new DriveApi(http_client); 
    var docs = await drive.files.list(maxResults: 10); 

    for (var itm in docs.items) { 
    print(itm.title); //list docs titles 
    } 
} 
関連する問題