Search code examples
c#.net-coregoogle-api-dotnet-clientgoogle-cloud-spanner

Google Spanner - Execute a query using custom credentials


Using C#, I am trying execute a query on Google Spanner db. I understand I can use the SpannerClient and all the current documentation explains how to execute a query quite simply, however these examples all assume default environment credentials.

I would like to execute a query against a given database but using custom credentials. So something like

var credentials = GoogleCredential.FromJson(jsonData);
SpannerClient client = new SpannerClient(connectionString, credentials)

var cmd = client.CreateSelectCommand("SELECT SingerId, AlbumId, AlbumTitle FROM Albums");

etc

I am currently unable to figure out how to do this?

Thanks


Solution

  • Currently this isn't as clean as we'd like it to be. You need to create a ChannelCredentials for the credentials, and provide that to the SpannerConnectionStringBuilder:

    // First load the credentials, scope them, and convert to ChannelCredentials.
    // You may want to move this to a separate method.
    var googleCredential = GoogleCredential.FromJson(jsonData);
    googleCredential = googleCredential.CreateScoped(SpannerClient.DefaultScopes);
    // Use self-signed JWTs for service accounts.
    // (This isn't strictly required, but reduces network usage.)
    if (googleCredential.UnderlyingCredential is ServiceAccountCredential serviceCredential)
    {
        googleCredential = GoogleCredential.FromServiceAccountCredential(
            serviceCredential.WithUseJwtAccessWithScopes(true));
    }
    // Note: this requires a using directive of "using Grpc.Auth;"
    var channelCredentials = googleCredential.ToChannelCredentials();
    
    
    // Now create a SpannerConnection with the SpannerCredentials
    using var conn = new SpannerConnection(connectionString, credentials);
    using var cmd = conn.CreateSelectCommand("SELECT ...");
    ...
    

    We definitely hope to improve this - we have a tracking bug you might want to subscribe to so that you can simplify your code when it's fixed.