/** * Refresh these credentials only if they have expired or are expiring imminently. * * @throws IOException during token refresh. */ public void refreshIfExpired() throws IOException { synchronized(lock) { if (shouldRefresh()) { refresh(); } } }
/** * Refresh these credentials only if they have expired or are expiring imminently. * * @throws IOException during token refresh. */ public void refreshIfExpired() throws IOException { synchronized(lock) { if (shouldRefresh()) { refresh(); } } }
/** * Provide the request metadata by ensuring there is a current access token and providing it * as an authorization bearer token. */ @Override public Map<String, List<String>> getRequestMetadata(URI uri) throws IOException { synchronized(lock) { if (shouldRefresh()) { refresh(); } return Preconditions.checkNotNull(requestMetadata, "requestMetadata"); } }
/** * Provide the request metadata by ensuring there is a current access token and providing it * as an authorization bearer token. */ @Override public Map<String, List<String>> getRequestMetadata(URI uri) throws IOException { synchronized(lock) { if (shouldRefresh()) { refresh(); } return Preconditions.checkNotNull(requestMetadata, "requestMetadata"); } }
@Test(expected = IllegalStateException.class) public void refresh_temporaryToken_throws() throws IOException { OAuth2Credentials credentials = OAuth2Credentials.newBuilder() .setAccessToken(new AccessToken(ACCESS_TOKEN, null)) .build(); credentials.refresh(); }
@Test public void refresh_refreshesToken() throws IOException { final String accessToken1 = "1/MkSJoj1xsli0AccessToken_NKPY2"; final String accessToken2 = "2/MkSJoj1xsli0AccessToken_NKPY2"; MockTokenServerTransportFactory transportFactory = new MockTokenServerTransportFactory(); transportFactory.transport.addClient(CLIENT_ID, CLIENT_SECRET); transportFactory.transport.addRefreshToken(REFRESH_TOKEN, accessToken1); OAuth2Credentials userCredentials = UserCredentials.newBuilder() .setClientId(CLIENT_ID) .setClientSecret(CLIENT_SECRET) .setRefreshToken(REFRESH_TOKEN) .setHttpTransportFactory(transportFactory) .build(); // Use a fixed clock so tokens don't expire userCredentials.clock = new TestClock(); // Get a first token Map<String, List<String>> metadata = userCredentials.getRequestMetadata(CALL_URI); TestUtils.assertContainsBearerToken(metadata, accessToken1); assertEquals(1, transportFactory.transport.buildRequestCount--); // Change server to a different token transportFactory.transport.addRefreshToken(REFRESH_TOKEN, accessToken2); // Confirm token being cached TestUtils.assertContainsBearerToken(metadata, accessToken1); assertEquals(0, transportFactory.transport.buildRequestCount); // Refresh to force getting next token userCredentials.refresh(); metadata = userCredentials.getRequestMetadata(CALL_URI); TestUtils.assertContainsBearerToken(metadata, accessToken2); assertEquals(1, transportFactory.transport.buildRequestCount--); }
@Test public void initialize_populatesOAuth2Credentials_handle401() throws IOException { final String accessToken = "1/MkSJoj1xsli0AccessToken_NKPY2"; final String accessToken2 = "2/MkSJoj1xsli0AccessToken_NKPY2"; MockTokenServerTransportFactory tokenServerTransportFactory = new MockTokenServerTransportFactory(); tokenServerTransportFactory.transport.addClient(CLIENT_ID, CLIENT_SECRET); tokenServerTransportFactory.transport.addRefreshToken(REFRESH_TOKEN, accessToken); OAuth2Credentials credentials = UserCredentials.newBuilder() .setClientId(CLIENT_ID) .setClientSecret(CLIENT_SECRET) .setRefreshToken(REFRESH_TOKEN) .setHttpTransportFactory(tokenServerTransportFactory) .build(); credentials.refresh(); HttpCredentialsAdapter adapter = new HttpCredentialsAdapter(credentials); HttpTransport primaryHttpTransport = new MockTokenCheckingTransport(tokenServerTransportFactory.transport, REFRESH_TOKEN); HttpRequestFactory requestFactory = primaryHttpTransport.createRequestFactory(); HttpRequest request = requestFactory.buildGetRequest(new GenericUrl("http://foo")); adapter.initialize(request); // now switch out the access token so that the original one is invalid, // requiring a refresh of the access token tokenServerTransportFactory.transport.addRefreshToken(REFRESH_TOKEN, accessToken2); HttpResponse response = request.execute(); // make sure that the request is successful despite the invalid access token assertEquals(200, response.getStatusCode()); assertEquals(MockTokenCheckingTransport.SUCCESS_CONTENT, response.parseAsString()); }
userCredentials.refresh();