Google Oauth error: At least one client secrets (Installed or Web) should be set

Not an expert on C# but it looks like you were trying to use the service account to do the OAuth2 web server flow, which shouldn't work. You probably want to use ServiceAccountCredential instead. For more information about different Google OAuth2 flows, please refer to the doc for web server, service account, etc.


The solution that uses json file is quite similar.

Here is sample that create VisionService using GoogleCredential object created from json file with ServiceAccountCredential.

GoogleCredential credential;
using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
    credential = GoogleCredential.FromStream(stream)
        .CreateScoped(VisionService.Scope.CloudPlatform);
}

var service = new VisionService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "my-app-name",
});

this sample require two NuGet packages:

Google.Apis.Vision.v1  
Google.Apis.Oauth2.v2

I managed to get a service account to work with a P12 file, But would like to know how to use with the JSON file, Or just value from the JSON file to create the certificate.

To get the token

    private static String GetOAuthCredentialViaP12Key()
    {
        const string serviceAccountEmail = SERVICE_ACCOUNT_EMAIL;
        var certificate = new X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret", X509KeyStorageFlags.Exportable);

        var scope = DriveService.Scope.Drive + " https://spreadsheets.google.com/feeds";
        var credential = new ServiceAccountCredential( new ServiceAccountCredential.Initializer(serviceAccountEmail)
                                                       {
                                                            Scopes  = new[] { scope }
                                                       }.FromCertificate(certificate) );

        if (credential.RequestAccessTokenAsync(CancellationToken.None).Result == false)
        {

            return null;
        }

        return credential.Token.AccessToken;
    }

And this is how I used the token I got

        // Initialize the variables needed to make the request
        OAuth2Parameters parameters = new OAuth2Parameters {AccessToken = token};
        GOAuth2RequestFactory requestFactory = new GOAuth2RequestFactory(null, "MySpreadsheetIntegration-v1", parameters);
        SpreadsheetsService service = new SpreadsheetsService("MySpreadsheetIntegration-v1");
        service.RequestFactory = requestFactory;