3

I run this code but it is giving Error: redirect_uri_mismatch .I set redirect uri in client_secret.json file. But each time redirect uri is like http://localhost:53271/Callback( port number changed each time) but not the one i have given in client_secret.json.

public class SheetsQuickstart {

private static final String APPLICATION_NAME = "Web client 1";

    private static final java.io.File DATA_STORE_DIR = new java.io.File(
    System.getProperty("user.home"), ".credentials/sheets.googleapis.com-java-quickstart");

/** Global instance of the {@link FileDataStoreFactory}. */
private static FileDataStoreFactory DATA_STORE_FACTORY;

/** Global instance of the JSON factory. */
private static final JsonFactory JSON_FACTORY =
    JacksonFactory.getDefaultInstance();

/** Global instance of the HTTP transport. */
private static HttpTransport HTTP_TRANSPORT;

/** Global instance of the scopes required by this quickstart.
 *
 * If modifying these scopes, delete your previously saved credentials
 * at ~/.credentials/sheets.googleapis.com-java-quickstart
 */
private static final List<String> SCOPES =
    Arrays.asList(SheetsScopes.SPREADSHEETS_READONLY);

static {
    try {
        HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
    } catch (Throwable t) {
        t.printStackTrace();
        System.exit(1);
    }
}

/**
 * Creates an authorized Credential object.
 * @return an authorized Credential object.
 * @throws IOException
 */
public static Credential authorize() throws IOException {
    // Load client secrets.
    InputStream in =
        SheetsQuickstart.class.getResourceAsStream("/client_secret.json");
    GoogleClientSecrets clientSecrets =
        GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow =
            new GoogleAuthorizationCodeFlow.Builder(
                    HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
            .setDataStoreFactory(DATA_STORE_FACTORY)
            .setAccessType("offline")
            .build();
    Credential credential = new AuthorizationCodeInstalledApp(
        flow, new LocalServerReceiver()).authorize("user");
    System.out.println(
            "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
    return credential;
}

/**
 * Build and return an authorized Sheets API client service.
 * @return an authorized Sheets API client service
 * @throws IOException
 */
public static Sheets getSheetsService() throws IOException {
    Credential credential = authorize();
    return new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
            .setApplicationName(APPLICATION_NAME)
            .build();
}

public static void main(String[] args) throws IOException {
    // Build a new authorized API client service.
    Sheets service = getSheetsService();

    // Prints the names and majors of students in a sample spreadsheet:
    // https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
    String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms";
    String range = "Class Data!A2:E";
    ValueRange response = service.spreadsheets().values()
        .get(spreadsheetId, range)
        .execute();
    List<List<Object>> values = response.getValues();
    if (values == null || values.size() == 0) {
        System.out.println("No data found.");
    } else {
      System.out.println("Name, Major");
      for (List row : values) {
        // Print columns A and E, which correspond to indices 0 and 4.
        System.out.printf("%s, %s\n", row.get(0), row.get(4));
      }
    }
}

}

2 Answers 2

6

I faced the same issue and I solved it by doing one of the following two steps:

  1. Specify a port number when you create the credential. Here I use 8080. Then you need to add http://localhost:8080/Callback to your authorized redirect url and update the json secret.
    Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver.Builder().setPort(8080).build()).authorize("user8");

  2. You are probably using OAuth 2.0 client IDs with web application. If this is only for testing, you can choose "other" as the type when you create the credential and it will save you the trouble.

Sign up to request clarification or add additional context in comments.

Comments

4

Add http://localhost/Callback (without the port number) to the list of redirect urls in your credential. Redownload the json file and use that one.

2 Comments

It is not working. I added localhost/Callback in credentials. But the class LocalServerReceiver() set some default redirect url each time i run the code like localhost:37151/Callback.
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); This should work and will set up a port for you. Full code here: https://github.com/googleworkspace/java-samples/blob/master/classroom/quickstart/src/main/java/ClassroomQuickstart.java

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.