0

Windows アプリケーションまたはサービスから Google ドライブを操作しようとしています。

Web App や MVC などは必要ありません。

システムはユーザーの介入なしに自動的に動作する必要があるため、サービス アカウントを作成し、証明書と電子メールを取得しました。

そしてもちろん、最後のクライアント ライブラリをダウンロードしました - http://code.google.com/p/google-api-dotnet-client/

ドキュメントのようにサービス オブジェクトを作成します。

        private const string SERVICE_ACCOUNT_EMAIL = "xxx@developer.gserviceaccount.com";
    private const string SERVICE_ACCOUNT_PKCS12_FILE_PATH = @"xxx-privatekey.p12";

    /// <summary>
    /// Build a Drive service object authorized with the service account.
    /// </summary>
    /// <returns>Drive service object.</returns>
    static DriveService BuildService ( )
    {
        X509Certificate2 certificate = new X509Certificate2 ( SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret",
            X509KeyStorageFlags.Exportable );

        var provider = new AssertionFlowClient ( GoogleAuthenticationServer.Description, certificate )
        {
            ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
            Scope = DriveService.Scopes.Drive.GetStringValue ( ),
            ServiceAccountUser = "myemail@gmail.com",
        };
        var auth = new OAuth2Authenticator<AssertionFlowClient> ( provider, AssertionFlowClient.GetState );
        return new DriveService ( auth );
    } // BuildService

そして、私はこれを行います:

service = BuildService ( );
FilesResource.InsertMediaUpload request = service.Files.Insert ( body, stream, mimeType );
request.Upload ( );
File file = request.ResponseBody;

Upload メソッドで例外が発生しました - 不明なオブジェクト識別子 (OID)。この例外をスローするコマンドを見つけました:

String signature = UnpaddedUrlSafeBase64Encode ( Key.SignData ( Encoding.ASCII.GetBytes ( assertion.ToString ( ) ), "SHA256" ) );

これは、Google.Apis.Authentication.OAuth2.dll、ファイル AssertionflowClient.cs、メソッド GenerateMessage にあります。

ただし、Google 証明書には SHA1 アルゴリズムしかありません。これは証明書情報ウィンドウから明らかです: X509Certificate2UI.DisplayCertificate ( certificate ); または窓から。

SHA1: String signature = UnpaddedUrlSafeBase64Encode ( Key.SignData ( Encoding.ASCII.GetBytes ( assertion.ToString ( ) ), "SHA1" ) ); を使用してみました。

その後、この例外は消えましたが、HTTP Error 400 (Invalid request) が発生しました。サービス アカウントで Google ドライブを操作するにはどうすればよいですか?

4

2 に答える 2

0

OAuth2 サービス アカウントページの指示に従って、新しいキーを生成しましたか?

他のサービス リクエストを試していただけますか。たとえば、メディア アップロードなしの挿入リクエスト (InsertRequest Insert(Google.Apis.Drive.v1.Data.File body)) を試してみてください。他の方法でもうまくいかない場合はお知らせください。

また、サービス アカウントのドキュメントには、「サービス アカウントは RSA SHA256 アルゴリズムと JWT トークン形式に依存しています」と記載されていることに注意してください。これがサポートされているアルゴリズムであり、SHA1 ではありません。

于 2013-03-20T12:59:37.967 に答える