当前位置: 首页 > 知识库问答 >
问题:

是否可以对服务帐户凭据使用json密钥而不是p12密钥?

何兴学
2023-03-14

我正在使用C#的“Google. Apis. Bigquery. v2客户端库”。

我授权使用“服务帐户”搜索BigQuery(请参阅http://www.afterlogic.com/mailbee-net/docs/OAuth2GoogleServiceAccounts.html). 要创建X509证书,我使用Google开发者控制台中的p12密钥。然而,现在json键是默认的。我可以用它来代替p12键吗?

我有以下代码

    string serviceAccountEmail = "xxxx@developer.gserviceaccount.com";

X509Certificate2 certificate;
using (Stream stream = new FileStream(@"C:\key.p12", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    using (MemoryStream ms = new MemoryStream())
    {
        stream.CopyTo(ms);
        certificate = new X509Certificate2(ms.ToArray(), "notasecret", X509KeyStorageFlags.Exportable);
    }
}

// Create credentials
ServiceAccountCredential credential = new ServiceAccountCredential(
    new ServiceAccountCredential.Initializer(serviceAccountEmail)
    {
        Scopes = new[] {
        BigqueryService.Scope.Bigquery,
        BigqueryService.Scope.CloudPlatform,
    },
    }.FromCertificate(certificate));

// Create the service
BaseClientService.Initializer initializer = new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "My Application",
    GZipEnabled = true,
};

BigqueryService service = new BigqueryService(initializer);
var projects = service.Projects.List().Execute();

共有3个答案

裘臻
2023-03-14

这对我有用:

var scopes = new[] { DriveService.Scope.Drive };

ServiceAccountCredential credential;
using (Stream stream = new FileStream(@"C:\path\key.json", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    credential =
        GoogleCredential.FromStream(stream).CreateScoped(scopes).UnderlyingCredential as
            ServiceAccountCredential;
}

显然,您将为范围变量和密钥文件的路径提供自己的值。您还需要获取Google. Apis. Auth. OAuth2Nuget包以及您计划使用凭据的任何其他特定于服务的包(在我的例子中是Google. Apis. Drive. v3)。

潘文乐
2023-03-14

我得到了这个链接,它表明在C#应用程序中使用JSON文件的服务帐户身份验证尚未添加到Google BigQuery API中。

https://github.com/google/google-api-dotnet-client/issues/533

洪富
2023-03-14

现在这是可能的(我使用了Google API的1.13.1.0版)。

BigQuery示例:

GoogleCredential credential;
using (Stream stream = new FileStream(@"C:\mykey.json", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    credential = GoogleCredential.FromStream(stream);
}

string[] scopes = new string[] {
    BigqueryService.Scope.Bigquery,
    BigqueryService.Scope.CloudPlatform, 
};
credential = credential.CreateScoped(scopes);

BaseClientService.Initializer initializer = new BaseClientService.Initializer()
{
    HttpClientInitializer = (IConfigurableHttpClientInitializer)credential,
    ApplicationName = "My Application",
    GZipEnabled = true,
};
BigqueryService service = new BigqueryService(initializer);

谷歌工作表示例:

GoogleCredential credential;
using (Stream stream = new FileStream(@"mykey.json", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    credential = GoogleCredential.FromStream(stream);
}
credential = credential.CreateScoped(new[] { 
    "https://spreadsheets.google.com/feeds", 
    "https://docs.google.com/feeds" });

string bearer;
try
{
    Task<string> task = ((ITokenAccess)credential).GetAccessTokenForRequestAsync();
    task.Wait();
    bearer = task.Result;
}
catch (AggregateException ex)
{
    throw ex.InnerException;
}

GDataRequestFactory requestFactory = new GDataRequestFactory("My Application");
requestFactory.CustomHeaders.Add(string.Format(CultureInfo.InvariantCulture, "Authorization: Bearer {0}", bearer));

SpreadsheetsService service = new SpreadsheetsService("My Application");
service.RequestFactory = requestFactory;
 类似资料:
  • 在AWS Xamarin SDK文档中,的Amazon Cognito Identity API文档在其第二段中指出,“必须使用AWS开发人员凭据来调用此API。” 现在,总的想法是尽量不要泄露API机密 但是上面粗体提到的这段文字是否意味着我不能使用IAM角色和/或策略来调用这些API?这是否意味着我必须在应用程序源代码中包含accessKey和secretKey? AWS提供了Cognito机

  • 我有一个在Firebase Web上运行的应用程序,使用实时数据库,并以Google作为唯一的身份验证提供者进行身份验证。我希望数据仅供用户读取,因此虽然我了解实时数据库提供安全传输和服务器存储,但我不希望自己能够在我的Firebase控制台中查看用户信息。 在用户设备上存储密钥的端到端加密不是理想的解决方案,因为我希望用户能够跨多个设备访问数据。 AES加密似乎是最好的解决方案,但通常的问题是将

  • 像这个问题,Google Photos API-身份验证,我对Google Photos API的身份验证很好奇。问题的一个答案说 您需要配置OAuth2.0凭据(客户端ID和机密),而不是API密钥。更多详细信息请参阅以下开发人员文档:https://developers.google.com/photos/library/guides/get-start#request-id Google P

  • 我正在使用ADFS 2.0开发OIOSAML。我需要对IdP响应进行签名和加密。以下是我对SAML请求和响应的签名和加密工作原理的理解: < li>SP使用自己的证书密钥(Key-1)对请求进行签名 < li>IdP使用SP的公钥(Key-1)验证请求 < li>IdP使用自己的证书密钥(Key-2)对响应进行签名 < li>IdP使用SP提供的证书密钥(Key-3)加密响应声明 < li>SP使

  • 问题内容: 我正在寻找一种重命名Hashmap密钥的方法,但是我不知道在Java中是否可行。 问题答案: 尝试删除该元素,然后使用新名称再次放置它。假设地图中的键是,则可以通过以下方式实现: