【问题标题】:How to set Redirect URI for OAuth2 for google in java如何在java中为google设置OAuth2的重定向URI
【发布时间】:2016-09-01 05:11:00
【问题描述】:

我运行了这段代码,但它给出了错误:redirect_uri_mismatch。我在 client_secret.json 文件中设置了重定向 uri。但是每次重定向 uri 就像 http://localhost:53271/Callback( 每次更改端口号) 但不是我在 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));
      }
    }
}

}

【问题讨论】:

    标签: java google-api url-redirection


    【解决方案1】:

    我遇到了同样的问题,我通过执行以下两个步骤之一解决了它:

    1. 在创建凭据时指定端口号。这里我使用的是 8080。那你需要在你的授权重定向 url 中添加http://localhost:8080/Callback 并更新 json 密码。
      Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver.Builder().setPort(8080).build()).authorize("user8");

    2. 您可能正在将 OAuth 2.0 客户端 ID 用于 Web 应用程序。如果这只是为了测试,你可以在创建凭证时选择“其他”作为类型,这样可以省去你的麻烦。

    【讨论】:

      【解决方案2】:

      http://localhost/Callback(不带端口号)添加到您凭据中的重定向网址列表中。重新下载 json 文件并使用那个。

      【讨论】:

      • 它不工作。我在凭据中添加了localhost/Callback。但是每次我运行 localhost:37151/Callback 之类的代码时,类 LocalServerReceiver() 都会设置一些默认重定向 url。
      • LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build(); 这应该可以工作并且会为你设置一个端口。完整代码在这里:https://github.com/googleworkspace/java-samples/blob/master/classroom/quickstart/src/main/java/ClassroomQuickstart.java
      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 2019-07-26
      • 2015-10-20
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      相关资源
      最近更新 更多