仅在Java中授权对Google Calendar API的请求一次

时间:2015-09-30 14:28:14

标签: java api google-calendar-api

我在Java API中查看谷歌日历并感到困惑。

我的问题是:当我运行我的应用程序时,它会生成一个URL,当我将它放入浏览器时会生成一个代码。我想知道下次我将如何运行应用程序不需要这个url来生成代码,我想知道是否有可能只做一次这些步骤!

以下是代码:

public void setUp() throws IOException, GeneralSecurityException {

            HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
            JacksonFactory jsonFactory = JacksonFactory.getDefaultInstance();

             // The clientId and clientSecret can be found in Google Developers Console


                String clientSecret = "0XgfTEYxDjTyQITWHd6YtxnT";

                // Or your redirect URL for web based applications.

                String redirectUrl = "urn:ietf:wg:oauth:2.0:oob";
                String scope = "https://www.googleapis.com/auth/calendar";

                GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow(
                    httpTransport, jsonFactory, CLIENT_ID, clientSecret, Collections.singleton(scope));

                // Step 1: Authorize
                String authorizationUrl = flow.newAuthorizationUrl().setRedirectUri(redirectUrl).build();


                // Point or redirect your user to the authorizationUrl.

                    System.out.println("Go to the following link in your browser:");
                    System.out.println(authorizationUrl);


                // Read the authorization code from the standard input stream.

                    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
                    System.out.println("What is the authorization code?");
                    String code = in.readLine();

                    // End of Step 1

                    // Step 2: Exchange

                    GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(redirectUrl)
                        .execute();

                     // End of Step 2
                    Credential credential = new GoogleCredential.Builder()
                    .setTransport(httpTransport).setJsonFactory(jsonFactory).setClientSecrets(CLIENT_ID, clientSecret)
                    .build().setFromTokenResponse(response);


                    service = new Calendar.Builder(httpTransport, jsonFactory, credential).setApplicationName("YOUR_APPLICATION_NAME").build();

        }

2 个答案:

答案 0 :(得分:0)

流程就像这样

  1. 您发送客户端ID / secret并获取用于身份验证的网址。

  2. 使用网址验证您自己并获取代码。

  3. 您使用access_token交换代码。

  4. 此访问令牌可以与api一起使用特定时间(通常为1小时)

  5. 因此,您可以生成一次access_tone,并且可以使用它一小时而不是一次又一次地生成它。

    static {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
          public void run() {
            synchronized(Singleton.class) {
              access_token = new MethodToInitializeAccessToken();
            }
          }
        }, 60 * 60 * 1000L /* Once per hour */);
      }
    

答案 1 :(得分:0)

抱歉,我没有足够的声誉来评论或要求你。但是,让我解释它的工作原理。

  1. 第一次使用正确的redirect_uri调用Google日历api网址时。只有当用户在Google商家信息页面中接受条件时,您才会获得authorization_code

  2. 获得authorization_code后,您会在回复中获得access_tokenrefresh_token

  3. access_token有限时间(我不知道确切的时间范围)。但是除非记录用户删除此活动的permissions,否则可以使用refresh_token。

  4. 如果您丢失了refresh_token,则需要再次从步骤1开始。