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 ドライブを操作するにはどうすればよいですか?