Получите com.google.gdata.util.ServiceForbiddenException после переноса приложения синхронизации контактов на новый компьютер

У меня есть приложение Java, которое использует API контактов Google для синхронизации контактов с локальным приложением КПК. Он отлично работал на моей старой машине, но после копирования исходного кода и всего (включая client_secrets.json) на новый ноутбук теперь я получаю следующую ошибку при вызове com.google.gdata.client.Service.getFeed():

com.google.gdata.util.ServiceForbiddenException: невозможно запросить контакты, принадлежащие другому пользователю

Я передаю тот же идентификатор пользователя и пароль, что и раньше, поэтому я не уверен, почему он говорит «другой пользователь».

Вот мой соответствующий код:

    // Initialize Contacts service      
    service = new ContactsService(cfg.gAppName);

    // Authorize the service

    Credential credential = authorize(CONTACTS_SCOPE, "contacts");
    if (credential != null && (credential.getExpiresInSeconds() == null || credential.getExpiresInSeconds() < 5)) {
        credential.refreshToken();
    }

    String token = credential.getAccessToken();
    service.setHeader("Authorization", "Bearer " + token);              

    // Request the feed
    contFeedUrl = new URL(BASE_CONT_URL + CONTACTS + cfg.gUser + "/full?max-results=999999");
    if (bFeed) {
        resultFeed = service.getFeed(contFeedUrl, ContactFeed.class);
    }

И это мой метод авторизации():

    protected Credential authorize(String scope, String subDir) throws Exception {

    File dataStoreDir = new File(System.getProperty("user.home"), ".store/gsync/" + cfg.dataStore + "/" + subDir);

    // initialize the transport
    httpTransport = GoogleNetHttpTransport.newTrustedTransport();

    // initialize the data store factory
    dataStoreFactory = new FileDataStoreFactory(dataStoreDir);

    // load client secrets
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
        new InputStreamReader(SyncMgr.class.getResourceAsStream("/client_secrets.json")));
    if (clientSecrets.getDetails().getClientId().startsWith("Enter")
            || clientSecrets.getDetails().getClientSecret().startsWith("Enter ")) {
        System.out.println(
                "Enter Client ID and Secret from https://code.google.com/apis/console/?api=calendar "
                + "into /client_secrets.json");
        System.exit(1);
    }
    // set up authorization code flow
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            httpTransport, JSON_FACTORY, clientSecrets,
            Collections.singleton(scope)).setDataStoreFactory(dataStoreFactory).build();
    // authorize
    return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize(cfg.gUser);
}

Любые идеи, как я могу заставить его работать на новой машине?


comment
Проверьте этот вопрос SO 30511117 и 20494138 если это может помочь вам.   -  person KENdi    schedule 24.09.2016
comment
Я проверил эти два вопроса и не очень помог. Похоже, что суть ответов на эти два других вопроса такова: убедитесь, что вы правильно используете OAuth2. Я думал, что это так, потому что, как упоминалось ранее, это отлично работало на другой машине. Просто когда я перенес код на новую машину, он перестал работать. Я думаю, что, возможно, проблема в том, что я еще не выполнил вход и согласие пользователя на новой машине. Но я не уверен, как заставить это произойти. Кто-нибудь знает, как?   -  person Eric S    schedule 28.09.2016
comment
Я понял! Я скопировал весь исходный код, банки и т. д. со старой машины на новую. Все они находились в одном каталоге. Но я не копировал каталог хранилища данных. Который находился под c:\users(user)\.store. Как только я это сделал, все снова заработало.   -  person Eric S    schedule 28.09.2016