无法使用C#/ .NET中的服务帐户在Google云端硬盘中进行授权

时间:2013-03-14 11:25:40

标签: c# .net certificate google-drive-api google-api-dotnet-client

我正在尝试使用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;

我在上传方法中遇到了异常 - 未知对象标识符(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);或者来自Windows。

我尝试过使用SHA1: String signature = UnpaddedUrlSafeBase64Encode(Key.SignData(Encoding.ASCII.GetBytes(assertion.ToString()),“SHA1”));

之后,此异常消失,但我收到HTTP错误400(无效请求)。 如何使用服务帐户使用Google云端硬盘?

2 个答案:

答案 0 :(得分:1)

在您的代码中删除

ServiceAccountUser = "myemail@gmail.com",

或 转到google apps域的管理控制台并授权您的服务帐户。

然后它有效。

答案 1 :(得分:0)

您是否按照OAuth2 service account页中的说明生成了新密钥?

你可以尝试其他服务请求吗,让我们说插入请求没有媒体上传(InsertRequest Insert(Google.Apis.Drive.v1.Data.File body)) - 让我知道其他方法是否也不适合你

请注意,在service account documentation中它说:“服务帐户依赖于RSA SHA256算法和JWT令牌格式”。这是支持的算法,而不是SHA1。