Как продлить срок хранения Oauth 2 StoredCredential - PullRequest
0 голосов
/ 05 августа 2020

Я делаю API для получения содержимого таблицы Google, но каждый час срок действия токена StoredCredential истекает, поэтому я должен вернуться в пользовательский интерфейс (меню, в котором вы выбираете свою учетную запись Google), как я могу расширить срок службы токена, поскольку программа будет запускаться каждый день, и я не хочу вводить свою учетную запись Google каждый день? Я уже пытался изменить время истечения срока, но это не сработало

Вот мой фактический код:

    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    
    private static final String TOKENS_DIRECTORY_PATH = "u:\\tokens";

    private static final List<String> SCOPES =
            Arrays.asList(SheetsScopes.SPREADSHEETS,SheetsScopes.DRIVE);

    private static final String CREDENTIALS_FILE_PATH = "credentials.json";

    private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws Exception {
        // Load client secrets.
        InputStream in = new FileInputStream(CREDENTIALS_FILE_PATH);
        if (in == null) {
            throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
        }
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
        
          FileDataStoreFactory fileDataStoreFactory = new FileDataStoreFactory(new File(TOKENS_DIRECTORY_PATH));
              DataStore<StoredCredential> datastore = fileDataStoreFactory.getDataStore("StoredCredential");
              datastore.values().forEach(x -> x.setExpirationTimeMilliseconds((long) 999999999));
              //DEBUG
              datastore.values().forEach(x -> System.out.println(x.getExpirationTimeMilliseconds()));
              
        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                //.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
                .setCredentialDataStore(datastore)
                .setAccessType("online")
                .setApprovalPrompt(null)
                .build();
        LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
        
        return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
    }

1 Ответ

0 голосов
/ 06 августа 2020

Прочитав документацию по другому моему вопросу, я нашел способ продлить срок службы файла StoredCredential, вам нужно изменить тип доступа с онлайн на офлайн.

Исправленная версия:

 private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    
    private static final String TOKENS_DIRECTORY_PATH = "u:\\tokens";

    private static final List<String> SCOPES =
            Arrays.asList(SheetsScopes.SPREADSHEETS,SheetsScopes.DRIVE);

    private static final String CREDENTIALS_FILE_PATH = "credentials.json";

    private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws Exception {
        // Load client secrets.
        InputStream in = new FileInputStream(CREDENTIALS_FILE_PATH);
        if (in == null) {
            throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
        }
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
        
          FileDataStoreFactory fileDataStoreFactory = new FileDataStoreFactory(new File(TOKENS_DIRECTORY_PATH));
              DataStore<StoredCredential> datastore = fileDataStoreFactory.getDataStore("StoredCredential");
              datastore.values().forEach(x -> x.setExpirationTimeMilliseconds((long) 999999999));
              //DEBUG
              datastore.values().forEach(x -> System.out.println(x.getExpirationTimeMilliseconds()));
              
        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                //.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
                .setCredentialDataStore(datastore)
                /* Here, we change the accessType */
                .setAccessType("offline")
                .setApprovalPrompt(null)
                .build();
        LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
...