Google Authentication 使用刷新令牌获取访问令牌

时间:2021-03-22 16:12:40

标签: push-notification google-calendar-api google-authentication google-developers-console

我正在使用 Push Notifications API 来集成客户的日历事件。我也创建了频道。但是我无法在身份验证时获得刷新令牌。我需要从 UI 获得用户同意,并根据验证码获得访问令牌和刷新令牌。但是当我尝试使用现有的刷新令牌获取访问令牌时,它要求提供客户端 ID 和机密。由于我只是使用用户的同意,我没有每个用户的客户端 ID 和客户端密码。如何为我的应用解决此问题?

我正在使用以下代码进行身份验证

private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT)
      throws IOException {
    // Load client secrets.
    InputStream in = CalendarQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
    if (in == null) {
      throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
    }
    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(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
            .setAccessType("offline")
            .build();
    LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
    return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
  }

这是我调用日历 API 的方式

public static void main(String... args) throws IOException, GeneralSecurityException {
    // Build a new authorized API client service.
    final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    Credential credential = getCredentials(HTTP_TRANSPORT);

    String accessToken = credential.getAccessToken();

    Calendar service =
        new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, googleCredential)
            .setApplicationName(APPLICATION_NAME)
            .build();

    System.out.println(accessToken);

    // List the next 10 events from the primary calendar.
    DateTime now = new DateTime(System.currentTimeMillis());
    Events events =
        service
            .events()
            .list("primary")
            .setMaxResults(10)
            .setTimeMin(now)
            .setOrderBy("startTime")
            .setSingleEvents(true)
            .execute();
    List<Event> items = events.getItems();
    if (items.isEmpty()) {
      System.out.println("No upcoming events found.");
    } else {
      System.out.println("Upcoming events");
      for (Event event : items) {
        DateTime start = event.getStart().getDateTime();
        if (start == null) {
          start = event.getStart().getDate();
        }
        // System.out.printf("%s %s (%s)\n", event.getId(), event.getSummary(), event.toString());
      }
    }
  }
}

0 个答案:

没有答案