API Листов Google - com.google.gdata.util.AuthenticationException: не удалось обновить токен доступа: 400 неверный запрос - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь получить доступ к электронной таблице Google для записи данных с использованием этого кода, но не могу выяснить точную проблему

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.gdata.data.spreadsheet.ListEntry;
import com.google.gdata.data.spreadsheet.ListFeed;
import com.google.gdata.data.spreadsheet.SpreadsheetEntry;
import com.google.gdata.data.spreadsheet.SpreadsheetFeed;
import com.google.gdata.data.spreadsheet.WorksheetEntry;
import com.google.gdata.data.spreadsheet.WorksheetFeed;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;

import java.io.File;
import java.io.IOException;

import java.net.MalformedURLException;
import java.net.URL;

import java.security.GeneralSecurityException;

import java.util.Arrays;
import java.util.List;


public class MySpreadsheetIntegration {
    public static void main(String[] args) throws AuthenticationException, MalformedURLException, IOException,
                                                  ServiceException, GeneralSecurityException {

        SpreadsheetService service = new SpreadsheetService("MySpreadsheetIntegration-v1");

        // TODO: Authorize the service object for a specific user (see other sections)

        File p12 = new File("D:/Key.p12");

        HttpTransport httpTransport = new NetHttpTransport();
        JacksonFactory jsonFactory = new JacksonFactory();
        String[] SCOPESArray = {
            "https://spreadsheets.google.com/feeds", "https://spreadsheets.google.com/feeds/spreadsheets/private/full",
            "https://docs.google.com/feeds"
        };
        final List SCOPES = Arrays.asList(SCOPESArray);
        GoogleCredential credential =
            new GoogleCredential.Builder().setTransport(httpTransport).setJsonFactory(jsonFactory).setServiceAccountId("client_id").setServiceAccountScopes(SCOPES).setServiceAccountPrivateKeyFromP12File(p12).build();
        service.setOAuth2Credentials(credential);
        // Define the URL to request.  This should never change.
        URL SPREADSHEET_FEED_URL = new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full");

        // Make a request to the API and get all spreadsheets.
        SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL, SpreadsheetFeed.class);
        List<SpreadsheetEntry> spreadsheets = feed.getEntries();

        if (spreadsheets.size() == 0) {
            // TODO: There were no spreadsheets, act accordingly.
        }

        // TODO: Choose a spreadsheet more intelligently based on your
        // app's needs.
        SpreadsheetEntry spreadsheet = spreadsheets.get(0);
        System.out.println(spreadsheet.getTitle().getPlainText());

        // Get the first worksheet of the first spreadsheet.
        // TODO: Choose a worksheet more intelligently based on your
        // app's needs.
        WorksheetFeed worksheetFeed = service.getFeed(spreadsheet.getWorksheetFeedUrl(), WorksheetFeed.class);
        List<WorksheetEntry> worksheets = worksheetFeed.getEntries();
        WorksheetEntry worksheet = worksheets.get(0);

        // Fetch the list feed of the worksheet.
        URL listFeedUrl = worksheet.getListFeedUrl();
        ListFeed listFeed = service.getFeed(listFeedUrl, ListFeed.class);

        // Create a local representation of the new row.
        ListEntry row = new ListEntry();
        row.getCustomElements().setValueLocal("firstname", "Joe");
        row.getCustomElements().setValueLocal("lastname", "Smith");

        // Send the new row to the API for insertion.
        row = service.insert(listFeedUrl, row);

    }
}

использовал все необходимые JAR-файлы и попытался передать идентификатор учетной записи службы, идентификатор электронной почты, идентификатор клиента в setServiceAccountId () , но каждый раз получал эту ошибку:

Исключение в теме "main" com.google.gdata.util.AuthenticationException: Failed to refresh access token: 400 Bad Request

{
  "error" : "invalid_grant",
  "error_description" : "Invalid JWT Signature."
}
at com.google.gdata.client.GoogleAuthTokenFactory$OAuth2Token.refreshToken(GoogleAuthTokenFactory.java:260)
at com.google.gdata.client.GoogleAuthTokenFactory.handleSessionExpiredException(GoogleAuthTokenFactory.java:702)
at com.google.gdata.client.GoogleService.handleSessionExpiredException(GoogleService.java:738)
at com.google.gdata.client.GoogleService.getFeed(GoogleService.java:649)
at com.google.gdata.client.Service.getFeed(Service.java:1017)
at spreadsheetdemo.MySpreadsheetIntegration.main(MySpreadsheetIntegration.java:53)

Причина: com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request

{
  "error" : "invalid_grant",
  "error_description" : "Invalid JWT Signature."
}
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:384)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
at com.google.gdata.client.GoogleAuthTokenFactory$OAuth2Token.refreshToken(GoogleAuthTokenFactory.java:258)
... 5 more

Процесс завершен с кодом выхода 1.

Пожалуйста, помогите мне

...