@Override public BackgroundException map(final TokenResponseException failure) { final StringBuilder buffer = new StringBuilder(); final TokenErrorResponse details = failure.getDetails(); if(null != details) { this.append(buffer, details.getErrorDescription()); } return new LoginFailureException(buffer.toString(), failure); } }
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { // Skip this filter if somehow we have a request that's not HTTP if (response instanceof HttpServletResponse && request instanceof HttpServletRequest) { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // Attempt to re-auth if we have an invalid grant exception. // This will only work if the request has not yet been committed. try { filterChain.doFilter(request, response); } catch (TokenResponseException e) { if (e.getDetails().getError().contains("invalid_grant")) { LOG.warning("User disabled Glassware. Attempting to re-authenticate"); httpResponse.sendRedirect(WebUtil.buildUrl(httpRequest, "/oauth2callback")); } } } }
/** * Obtain new access token from the refresh token & client credentials. */ private String getAccessToken() { try { final TokenResponse response = new GoogleRefreshTokenRequest(new NetHttpTransport(), new JacksonFactory(), passwordRegistry.getPassword(getRefreshTokenKeyStoreId()).getDecryptedValue(), getClientId(), passwordRegistry.getPassword(getClientSecretKeyStoreId()).getDecryptedValue()).execute(); return response.getAccessToken(); } catch (IOException e) { log.debug("Error while requesting the access token.", e); if (e instanceof TokenResponseException) { TokenErrorResponse details = ((TokenResponseException) e).getDetails(); if (details != null) { log.debug(details.getError()); } } throw new RuntimeException(e); } }