Google api 如何控制google API访问的令牌响应到期时间
我无法将google访问令牌的有效性标准延长一小时。 我的代码的一部分是从用户那里获得授权,按照谷歌的建议使用GoogleAuthorizationCodeFlow。这可以很好地工作,并为我提供了一个令牌响应,我可以在应用程序的其他部分(用户未连接的部分)中使用它 根据Google文档,我认为流中的脱机访问类型将使TokenResponse能够在用户不撤销它的情况下使用更长的时间。但是很明显,当我在用户授权后使用这个tokenresponse时,它可以正常工作,但是当我在一个多小时后使用它时,我会收到一个无效的凭证,该凭证由谷歌发回 以下是在用户授权后创建TokenResponse的代码:Google api 如何控制google API访问的令牌响应到期时间,google-api,google-oauth,google-oauth-java-client,Google Api,Google Oauth,Google Oauth Java Client,我无法将google访问令牌的有效性标准延长一小时。 我的代码的一部分是从用户那里获得授权,按照谷歌的建议使用GoogleAuthorizationCodeFlow。这可以很好地工作,并为我提供了一个令牌响应,我可以在应用程序的其他部分(用户未连接的部分)中使用它 根据Google文档,我认为流中的脱机访问类型将使TokenResponse能够在用户不撤销它的情况下使用更长的时间。但是很明显,当我在用户授权后使用这个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;
}
}
下面是使用此TokenResponse的脱机代码:
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);
}
}
看来这个问题已经得到了答复。 要获取启用所需内容的刷新令牌,我需要使用approval\u prompt=force参数builder.setApprovalPromptforce构建流 根据注释,这需要在流初始化中完成脱机访问 不过,这是一个补充:尽管我从谷歌文档中复制并粘贴了离线代码(可能是旧版本),但我的问题中的离线代码并不能正常工作。凭证需要使用其生成器对象 以下是功能齐全的脱机代码:
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);
}
那不正确。您可能需要出于其他原因强制批准,但这并不影响您是否赢得刷新令牌。要获取刷新令牌,您需要请求脱机访问。