protected Builder(OAuth2Credentials credentials) { this.accessToken = credentials.getAccessToken(); }
public OAuth2Credentials build() { return new OAuth2Credentials(accessToken); } }
/** * Returns the credentials instance from the given access token. * * @param accessToken the access token * @return the credentials instance * @deprecated Use {@link #create(AccessToken)} instead. This method will be deleted in a later * version. */ @Deprecated public static OAuth2Credentials of(AccessToken accessToken) { return create(accessToken); }
/** * 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 the token by discarding the cached token and metadata and requesting the new ones. */ @Override public void refresh() throws IOException { synchronized(lock) { requestMetadata = null; temporaryAccess = null; useAccessToken(Preconditions.checkNotNull(refreshAccessToken(), "new access token")); if (changeListeners != null) { for (CredentialsChangedListener listener : changeListeners) { listener.onChanged(this); } } } }
@Test public void constructor_storesAccessToken() { OAuth2Credentials credentials = OAuth2Credentials.newBuilder() .setAccessToken(new AccessToken(ACCESS_TOKEN, null)) .build(); assertEquals(credentials.getAccessToken().getTokenValue(), ACCESS_TOKEN); }
@Test public void hashCode_equals() throws IOException { final String accessToken = "1/MkSJoj1xsli0AccessToken_NKPY2"; OAuth2Credentials credentials = OAuth2Credentials.newBuilder() .setAccessToken(new AccessToken(accessToken, null)) .build(); OAuth2Credentials otherCredentials = OAuth2Credentials.create(new AccessToken(accessToken, null)); assertEquals(credentials.hashCode(), otherCredentials.hashCode()); }
userCredentials.addChangeListener(listener); assertEquals(0, listener.callCount); userCredentials.getRequestMetadata(CALL_URI); assertEquals(1, listener.callCount); userCredentials.refresh(); assertEquals(2, listener.callCount); userCredentials.removeChangeListener(listener); transportFactory.transport.addRefreshToken(REFRESH_TOKEN, accessToken2); userCredentials.refresh(); assertEquals(2, listener.callCount);
@Test public void serialize() throws IOException, ClassNotFoundException { final String accessToken = "1/MkSJoj1xsli0AccessToken_NKPY2"; OAuth2Credentials credentials = OAuth2Credentials.newBuilder() .setAccessToken(new AccessToken(accessToken, null)) .build(); OAuth2Credentials deserializedCredentials = serializeAndDeserialize(credentials); assertEquals(credentials, deserializedCredentials); assertEquals(credentials.hashCode(), deserializedCredentials.hashCode()); assertEquals(credentials.toString(), deserializedCredentials.toString()); assertSame(deserializedCredentials.clock, Clock.SYSTEM); }
@Test(expected = IllegalStateException.class) public void refresh_temporaryToken_throws() throws IOException { OAuth2Credentials credentials = OAuth2Credentials.newBuilder() .setAccessToken(new AccessToken(ACCESS_TOKEN, null)) .build(); credentials.refresh(); }
userCredentials.addChangeListener(listener); Map<String, List<String>> metadata; assertEquals(0, listener.callCount); metadata = userCredentials.getRequestMetadata(CALL_URI); TestUtils.assertContainsBearerToken(metadata, accessToken1); assertEquals(accessToken1, listener.accessToken.getTokenValue()); userCredentials.refresh(); metadata = userCredentials.getRequestMetadata(CALL_URI); TestUtils.assertContainsBearerToken(metadata, accessToken2); assertEquals(accessToken2, listener.accessToken.getTokenValue());
@Test public void equals_true() throws IOException { final String accessToken1 = "1/MkSJoj1xsli0AccessToken_NKPY2"; OAuth2Credentials credentials = OAuth2Credentials.newBuilder() .setAccessToken(new AccessToken(accessToken1, null)) .build(); OAuth2Credentials otherCredentials = OAuth2Credentials.newBuilder() .setAccessToken(new AccessToken(accessToken1, null)) .build(); assertTrue(credentials.equals(otherCredentials)); assertTrue(otherCredentials.equals(credentials)); }
@Test public void getRequestMetadata_temporaryToken_hasToken() throws IOException { OAuth2Credentials credentials = OAuth2Credentials.newBuilder() .setAccessToken(new AccessToken(ACCESS_TOKEN, null)) .build(); // Verify getting the first token Map<String, List<String>> metadata = credentials.getRequestMetadata(CALL_URI); TestUtils.assertContainsBearerToken(metadata, ACCESS_TOKEN); }
@Test public void toString_containsFields() throws IOException { AccessToken accessToken = new AccessToken("1/MkSJoj1xsli0AccessToken_NKPY2", null); OAuth2Credentials credentials = OAuth2Credentials.newBuilder() .setAccessToken(accessToken) .build(); String expectedToString = String.format("OAuth2Credentials{requestMetadata=%s, temporaryAccess=%s}", ImmutableMap.of(AuthHttpConstants.AUTHORIZATION, ImmutableList.of(OAuth2Utils.BEARER_PREFIX + accessToken.getTokenValue())), accessToken.toString()); assertEquals(expectedToString, credentials.toString()); }
@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--); }
/** * Returns the credentials instance from the given access token. * * @param accessToken the access token * @return the credentials instance */ public static OAuth2Credentials create(AccessToken accessToken) { return OAuth2Credentials.newBuilder().setAccessToken(accessToken).build(); }
/** * Create a new token via {@link OAuth2Credentials#refreshAccessToken()}, and then update the cache. * @return the new token */ private HeaderCacheElement updateToken() { HeaderCacheElement newToken; try { LOG.info("Refreshing the OAuth token"); newToken = new HeaderCacheElement(credentials.refreshAccessToken()); } catch (Exception e) { LOG.warn("Got an unexpected exception while trying to refresh google credentials.", e); newToken = new HeaderCacheElement( Status.UNAUTHENTICATED .withDescription("Unexpected error trying to authenticate") .withCause(e) ); } synchronized (lock) { // Update the token only if the new token is good or the old token is bad if (newToken.isValid() || !headerCache.isValid()) { headerCache = newToken; } else { LOG.warn("Failed to refresh the access token. Falling back to existing token. " + "New token state: {}, status: {}", newToken.getCacheState(), newToken.getToken().status); } futureToken = null; return headerCache; } }
@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()); }
/** * 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(); } } }
@Test public void equals_false_accessToken() throws IOException { final String accessToken1 = "1/MkSJoj1xsli0AccessToken_NKPY2"; final String accessToken2 = "2/MkSJoj1xsli0AccessToken_NKPY2"; OAuth2Credentials credentials = OAuth2Credentials.newBuilder() .setAccessToken(new AccessToken(accessToken1, null)) .build(); OAuth2Credentials otherCredentials = OAuth2Credentials.newBuilder() .setAccessToken(new AccessToken(accessToken2, null)) .build(); assertFalse(credentials.equals(otherCredentials)); assertFalse(otherCredentials.equals(credentials)); }