2016-11-07 5 views
0

Я пытаюсь получить доступ к Google Таблицам из моего бэкэнда, написанного в Spring MVC. С помощью учебника я получаю что-то вроде этого:Доступ к листам Google из Spring MVC

public static Sheets getSheetsService() throws IOException { 
    return new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, authorize()) 
      .setApplicationName(APPLICATION_NAME) 
      .build(); 
} 

public static Credential authorize() throws IOException { 
    // Load client secrets. 
    InputStream in = 
      ConcreteSheetsController.class.getResourceAsStream("/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; 
} 

Секрет создается так, как это описано здесь: https://developers.google.com/sheets/quickstart/java

Это «работает», но выход из приложения дает мне ссылку. Когда я нажимаю на нее, мой браузер просит меня выбрать учетную запись Google. Если я это сделаю, все будет хорошо, но я хотел бы иметь более подходящее решение для сервера. Я хотел бы, чтобы мой файл secret.json позволял моему приложению регистрироваться без меня, предоставляя собственную учетную запись пользователя. Есть ли способ сделать эту работу?

+0

Вы можете попытаться взглянуть на служебные учетные записи в разделе Использование [OAuth 2.0 для сервера для серверных приложений] (https://developers.google.com/identity/protocols/OAuth2ServiceAccount). Вы можете совершать вызовы API, особенно при вызове облачных API для доступа к данным на основе проектов, а не к данным, специфичным для пользователя. – noogui

ответ

0

Попробуйте использовать стороннюю библиотеку Gdata вместо google.v4. Вот код, который я использую для передачи учетных данных. Вам нужно будет создать файл P12 google's console.

Тогда, очевидно, большая часть вашего рабочего листа/чтения/записи рабочей книги должна быть изменена для соответствия методам gdata.

Надеюсь, это поможет, если не уберете какие-либо вопросы, я, возможно, смогу помочь.

// Application name 
    private static final String APPLICATION_NAME = "spreadsheet-application-name"; 

    // account info and p12 
    private static final String ACCOUNT_P12_ID = "[email protected]"; 
    private static File P12FILE; 

    private static String ssName = "Spreadsheet name"; 
    private static String wsName = "worksheetname"; //this has to be all lower case for some reason 

    // scopes 
    private static final List<String> SCOPES = Arrays.asList(
      "https://docs.google.com/feeds", 
      "https://spreadsheets.google.com/feeds"); 

    // Spreadsheet API URL 
    private static final String SPREADSHEET_URL = "https://spreadsheets.google.com/feeds/spreadsheets/private/full"; 

    private static final URL SPREADSHEET_FEED_URL; 

    static { 
     try { 
      SPREADSHEET_FEED_URL = new URL(SPREADSHEET_URL); 
      P12FILE = getP12File(); 
     } catch (MalformedURLException e) { 
      throw new RuntimeException(e); 
     } 
    } 
    // Authorize- 
    private static Credential authorize() throws Exception { 

     HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
     JsonFactory jsonFactory = new JacksonFactory(); 

     GoogleCredential credential = new GoogleCredential.Builder() 
       .setTransport(httpTransport) 
       .setJsonFactory(jsonFactory) 
       .setServiceAccountId(ACCOUNT_P12_ID) 
       .setServiceAccountPrivateKeyFromP12File(P12FILE) 
       .setServiceAccountScopes(SCOPES) 
       .build(); 

//  boolean ret = credential.refreshToken(); 
     // debug dump 
//  Log.debug("refreshToken:" + ret); 

     // debug dump 
//  if (credential != null) { 
//   Log.debug("AccessToken:" + credential.getAccessToken()); 
//  } 


     return credential; 
    } 

    // Get service 
    private static SpreadsheetService getService() throws Exception { 

     SpreadsheetService service = new SpreadsheetService(APPLICATION_NAME); 
     service.setProtocolVersion(SpreadsheetService.Versions.V3); 

     Credential credential = authorize(); 
     service.setOAuth2Credentials(credential); 

     // debug dump 
//  Log.debug("Schema: " + service.getSchema().toString()); 
//  Log.debug("Protocol: " + service.getProtocolVersion().getVersionString()); 
//  Log.debug("Service Version: " + service.getServiceVersion()); 


     return service; 
    } 

    private static File getP12File(){ 
     ClassLoader classLoader = GoogleSheetsWriter.class.getClassLoader(); 
     return new File(classLoader.getResource("DriveAPITest-bf290e0ee314.p12").getFile()); 
    } 
Смежные вопросы