【问题标题】:C# Stackdriver Trace credentials from file来自文件的 C# Stackdriver Trace 凭据
【发布时间】:2020-01-13 00:10:56
【问题描述】:

我使用带有 C#(dotnet 核心)的 Google 云 Stackdriver Trace API 并根据此article 工作。

我已经添加了所有需要的代码并想在本地尝试(在我的开发机器上)。由于我不是从 GCP 云运行,因此我创建了一个具有所需权限的新服务帐户。谷歌在文章中说:

GCP 客户端库使用应用程序默认凭据 (ADC) 来查找 您的应用程序的凭据。您通过以下方式提供这些凭据 设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量:

export GOOGLE_APPLICATION_CREDENTIALS=path-to-your-service-accounts-private-key

现在我的代码在达到这一点时失败了:

services.AddGoogleExceptionLogging(options =>
{
    options.ProjectId = Configuration["Stackdriver:ProjectId"];
    options.ServiceName = Configuration["Stackdriver:ServiceName"];
    options.Version = Configuration["Stackdriver:Version"];
});

带有消息:

System.InvalidOperationException: '读取凭证文件时出错 位置 C:******.json: 找不到文件。 请检查环境的值 变量 GOOGLE_APPLICATION_CREDENTIALS'

出于多种原因,我不想使用名为GOOGLE_APPLICATION_CREDENTIALS 的环境变量。相反,我正在寻找一种方法来为其提供实际文件路径,而不使用环境变量。

我该怎么做?

【问题讨论】:

    标签: c# stackdriver google-cloud-stackdriver google-cloud-trace


    【解决方案1】:

    你正在使用的命令

    出口 GOOGLE_APPLICATION_CREDENTIALS=path-to-your-service-accounts-private-key

    在Linux中使用,但您的帖子指定的错误

    .... 从位置 C:******.json 读取凭证文件时出错:可能 找不到文件.....

    在这种情况下,您似乎使用的是 windows,您需要使用命令“SET”来分配值,位于“Setting the environment variable”段落中。

    您还可以在代码中传递服务帐户密钥,在这种情况下,您需要安装Cloud Storage client library,您可以在段落“Passing the path to the service account key in code” 中查看示例,您可以在其中看到此 C# 代码,并且您有指向带有示例代码的 GitHub。

    // Some APIs, like Storage, accept a credential in their Create()
    // method.
    public object AuthExplicit(string projectId, string jsonPath)
    {
        // Explicitly use service account credentials by specifying
        // the private key file.
        var credential = GoogleCredential.FromFile(jsonPath);
        var storage = StorageClient.Create(credential);
        // Make an authenticated API request.
        var buckets = storage.ListBuckets(projectId);
        foreach (var bucket in buckets)
        {
            Console.WriteLine(bucket.Name);
        }
        return null;
    }
    // Other APIs, like Language, accept a channel in their Create()
    // method.
    public object AuthExplicit(string projectId, string jsonPath)
    {
        var credential = GoogleCredential.FromFile(jsonPath)
            .CreateScoped(LanguageServiceClient.DefaultScopes);
        var channel = new Grpc.Core.Channel(
            LanguageServiceClient.DefaultEndpoint.ToString(),
            credential.ToChannelCredentials());
        var client = LanguageServiceClient.Create(channel);
        AnalyzeSentiment(client);
        return 0;
    }
    

    【讨论】:

    • 您附加的代码是基于StorageClient的,在我提到的示例中-没有地方使用它(StorageClient
    • 是一个使用示例,您可以查看这一行 "var credential = GoogleCredential.FromFile(jsonPath)" ,在该代码所在的同一页面中您可以查看一个按钮“在 GitHub 上查看”您可以在其中观察一个名为 AuthSample 的完整代码。
    • 我在项目的其他地方熟悉该代码。但是在这里,我没有使用credential 变量的地方。使用 Storage 对象时,您有重载使用它 (StorageClient.Create(cred))
    【解决方案2】:

    由于您不想使用环境变量,您是否尝试过使用 gcloud SDK 进行身份验证?

    正如here 解释的那样:

    如果在本地运行以进行开发/测试,您可以使用 Google Cloud SDK 进行身份验证。如果您还没有下载 SDK,然后在命令行中运行以下命令登录:

    gcloud auth 应用程序-默认登录

    否则,唯一的其他方法就是在源代码中指定路径。

    您应该可以使用here 提供的示例来做到这一点。调整它以满足您的特定需求。

    此示例展示了如何使用从 JSON 文件加载的凭据创建客户端:

    using Google.Cloud.ErrorReporting.V1Beta1;
    using Google.Apis.Auth.OAuth2;
    using Grpc.Auth;
    using Grpc.Core;
    ...
    GoogleCredential cred = GoogleCredential.FromFile("/path/to/credentials.json");
    Channel channel = new Channel(
        ReportErrorsServiceClient.DefaultEndpoint.Host, ReportErrorsServiceClient.DefaultEndpoint.Port, cred.ToChannelCredentials());
    ReportErrorsServiceClient client = ReportErrorsServiceClient.Create(channel);
    ...
    // Shutdown the channel when it is no longer required.
    channel.ShutdownAsync().Wait();
    

    【讨论】:

      猜你喜欢
      • 2020-03-28
      • 2020-09-21
      • 2021-12-11
      • 2019-01-18
      • 2019-04-10
      • 2019-07-10
      • 2020-10-19
      • 2022-07-14
      • 1970-01-01
      相关资源
      最近更新 更多