2013-12-19 51 views
0

我有問題將Google訪問令牌的有效期延長標準一小時。 我的代碼的一部分獲得了用戶的授權,使用的是Google推薦的GoogleAuthorizationCodeFlow。這工作正常,並給我一個TokenResponse,我堅持將其用於未連接用戶的應用程序的其他部分。如何控制Google API訪問的令牌響應過期時間

根據谷歌的文檔,我認爲流程中的"offline"訪問類型將使得TokenResponse可用,只要用戶不撤銷它。但顯然,當我在用戶授權後使用這個TokenReponse時,它運行良好,但是當我在超過一個小時後使用它時,我收到了Google發回的「無效憑據」。

這裏是一個創建TokenResponse一旦用戶授權其代碼:

private HttpTransport HTTP_TRANSPORT; 
private JacksonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); 

private static GoogleAuthorizationCodeFlow flow; 

@PostConstruct 
public void init() { 
    try { 

     HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); 
    } catch (GeneralSecurityException | IOException e) { 
     logger.info(String.format("Raised Exception while getting GoogleNetHttpTransport : %s", e.getMessage())); 
     e.printStackTrace(); 
    } 
    flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, APP_ID, APP_SECRET, 
      Collections.singleton(CalendarScopes.CALENDAR_READONLY)).setAccessType("offline").build(); 
} 
@RequestMapping(value = Uris.GOOGLERD) 
public ModelAndView googleCallBack(HttpServletRequest request, @RequestParam(value = "state", required = false) String state, 
     @RequestParam(value = "code", required = false) String code, 
     @RequestParam(value = "error", required = false) String error, Model model) { 
    DynSubscriber dynSubscriber = (DynSubscriber) request.getSession().getAttribute("dynSubscriber"); 
    ModelAndView toReturn = new ModelAndView("confirmation"); 
    toReturn.addObject("buttonLabel", "Accueil"); 

    try { 

     AuthorizationCodeTokenRequest tokenRequest = flow.newTokenRequest(code); 
     TokenResponse tr = tokenRequest.setRedirectUri(request.getRequestURL().toString()).execute(); 


     // Json Conversion of Token Response for future use 
     StringWriter jsonTrWriter = new StringWriter(); 
     JsonGenerator generator = JSON_FACTORY.createJsonGenerator(jsonTrWriter); 
     generator.serialize(tr); 
     generator.flush(); 
     generator.close(); 


     //Persists google access info 
     dynSubOp.setSPConnexionInfo(dynSubscriber, jsonTrWriter.toString(), DynServiceProviderType.GOOGLECAL); 
     toReturn.addObject("message","Agenda Google autorisé"); 

    } catch (IOException | DynServicesException e) { 
     logger.error(String.format("Exception raised in googleCallBack for subscriber %s : %s", dynSubscriber.buildFullName(), e.getMessage()),e); 
     toReturn.addObject("message", "Problème lors du processus d'autorisation google"); 
    } 

    return toReturn; 
} 
} 

這裏是使用這種TokenReponse的離線碼:

private com.google.api.services.calendar.Calendar calendarConnection; 


public DynGoogleCalendarRetriever(String subid, String connectionInformation) 
     throws CalendarConnectionNotAuthorizedException { 


    TokenResponse tr; 
    try { 
     HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); 
     tr = JSON_FACTORY.fromString(connectionInformation, TokenResponse.class); 

     Credential c = new GoogleCredential().setFromTokenResponse(tr); 
     calendarConnection = new com.google.api.services.calendar.Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, c) 
       .build(); 
    } catch (IOException | GeneralSecurityException e) { 
     logger.error(String.format("Failure creating the credentials for subscriber id %s", subid), e); 
     throw new CalendarConnectionNotAuthorizedException(String.format(
       "Failure creating the credentials for subscriber id %s", subid), e); 
    } 


} 

回答

0

看起來這已回答在this other SO question。 要獲得啓用我想要的刷新令牌,我需要使用approval_prompt = force參數來構建流(builder.setApprovalPrompt("force")

根據註釋,這需要在流初始化中完成的離線訪問。

但是補充:我的問題中的離線代碼不起作用,雖然我從谷歌文檔(可能是舊版本)複製並粘貼它。 Credential需要使用它的Builder對象。

這裏是完全functionnal離線碼:

TokenResponse tr; 
    try { 
     HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); 
     tr = JSON_FACTORY.fromString(connectionInformation, TokenResponse.class); 

     Credential c = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT).setJsonFactory(JSON_FACTORY) 
       .setClientSecrets(APP_ID, APP_SECRET).build().setFromTokenResponse(tr); 

     calendarConnection = new com.google.api.services.calendar.Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, c) 
       .build(); 
    } catch (IOException | GeneralSecurityException e) { 
     logger.error(String.format("Failure creating the credentials for subscriber id %s", subid), e); 
     throw new CalendarConnectionNotAuthorizedException(String.format(
       "Failure creating the credentials for subscriber id %s", subid), e); 
    } 
+1

那不是正確的報價。您可能需要強制其他原因獲得批准,但這並不影響您是否贏得刷新令牌。要獲得刷新令牌,您需要請求*脫機*訪問。 – pinoyyid

相關問題