java-samples icon indicating copy to clipboard operation
java-samples copied to clipboard

IllegalArgumentException being thrown when trying to authenticate with google sheets api

Open aeslami3574 opened this issue 5 years ago • 6 comments
trafficstars

(Please fill out these details before submitting an issue)

Sample Name

Modified version of https://developers.google.com/sheets/api/quickstart/java

private Credential getCredentials(NetHttpTransport httpTransport) {
    try {
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(new FileInputStream(credentialsFilePath)));
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(new FileDataStoreFactory(new File(credentialsFilePath))).setAccessType("offline")
                .build();
        return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver.Builder().setPort(8888).build()).authorize("user");
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

Expected Behavior

Was expecting to receive a Credential object after successfully authenticating with the google api

Actual

Exception in thread "main" java.lang.IllegalArgumentException
	at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:111)
	at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37)
	at com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.getDetails(GoogleClientSecrets.java:82)
	at com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow$Builder.<init>(GoogleAuthorizationCodeFlow.java:195)

Specifications

  • Java version: 11.0.5
  • OS: Linux (Debian 10.2 Buster)

aeslami3574 avatar Dec 02 '19 18:12 aeslami3574

Check your client secrets file to make sure it's correct. Possible that you downloaded credentials in the wrong form.

That error indicates it's not in the expected format as isn't either for a server-side web app or installed (desktop) app. Corresponding code: https://github.com/googleapis/google-api-java-client/blob/master/google-api-client/src/main/java/com/google/api/client/googleapis/auth/oauth2/GoogleClientSecrets.java

sqrrrl avatar Dec 03 '19 20:12 sqrrrl

Ping @aeslami3574 -- please verify your credentials are the correct type. Otherwise will close issue as not reproducible.

sqrrrl avatar Jan 21 '20 19:01 sqrrrl

I had the same issue using the wrong credentials.json I have downloaded for a service account, created to access google sheets from a web application. I was banging my head until I discovered that I needed an OAuth credentials, set "Web Application" as application type json file that has been downloaded from google cloud console.

My credentials file should looks like this:

{
	"web": {
		"client_id": String,
		"project_id": String,
		"auth_uri": String,
		"token_uri": String,
		"auth_provider_x509_cert_url": String,
		"client_secret": String
	}
}

cdolek avatar Oct 15 '20 16:10 cdolek

My workaround: Don't use the client secrets, instead, directly build the credentials.

Import this library

<dependency>
        <groupId>com.google.auth</groupId>
        <artifactId>google-auth-library-oauth2-http</artifactId>
        <version>1.3.0</version>
</dependency>
InputStream in = SheetsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
if (in == null) {
        throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
}
GoogleCredentials googleCredentials = GoogleCredentials.fromStream(in).createScoped(SCOPES);

Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, new HttpCredentialsAdapter(googleCredentials))
                .setApplicationName(APPLICATION_NAME)
                .build();

Johnny850807 avatar Apr 09 '22 05:04 Johnny850807

My workaround: Don't use the client secrets, instead, directly build the credentials.

Import this library

<dependency>
        <groupId>com.google.auth</groupId>
        <artifactId>google-auth-library-oauth2-http</artifactId>
        <version>1.3.0</version>
</dependency>
InputStream in = SheetsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
if (in == null) {
        throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
}
GoogleCredentials googleCredentials = GoogleCredentials.fromStream(in).createScoped(SCOPES);

Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, new HttpCredentialsAdapter(googleCredentials))
                .setApplicationName(APPLICATION_NAME)
                .build();

This is the most accurate answer until today. Hopefully, more developers can see this.

weehong avatar Jul 11 '22 04:07 weehong

My workaround: Don't use the client secrets, instead, directly build the credentials.

Import this library

<dependency>
        <groupId>com.google.auth</groupId>
        <artifactId>google-auth-library-oauth2-http</artifactId>
        <version>1.3.0</version>
</dependency>
InputStream in = SheetsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
if (in == null) {
        throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
}
GoogleCredentials googleCredentials = GoogleCredentials.fromStream(in).createScoped(SCOPES);

Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, new HttpCredentialsAdapter(googleCredentials))
                .setApplicationName(APPLICATION_NAME)
                .build();

Works like a charm! If you see this - use this

THANK YOU @Johnny850807 Hey @google come on, update your docs!

velikanov avatar Sep 15 '22 14:09 velikanov