Skip to content

Commit fe44d1e

Browse files
author
Yaniv Inbar
committed
1 parent b4ab215 commit fe44d1e

File tree

2 files changed

+150
-20
lines changed

2 files changed

+150
-20
lines changed

google-api-client-appengine/.classpath

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<classpath>
33
<classpathentry kind="src" path="src/main/java" />
4-
<classpathentry kind="src" path="src/test/java" />
54
<classpathentry kind="con"
65
path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6" />
76
<classpathentry kind="output" path="target/classes" />

google-api-client/src/main/java/com/google/api/client/googleapis/auth/oauth2/GoogleCredential.java

Lines changed: 150 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,40 +17,57 @@
1717
import com.google.api.client.auth.oauth2.BearerToken;
1818
import com.google.api.client.auth.oauth2.ClientParametersAuthentication;
1919
import com.google.api.client.auth.oauth2.Credential;
20-
import com.google.api.client.auth.oauth2.TokenErrorResponse;
20+
import com.google.api.client.auth.oauth2.CredentialRefreshListener;
21+
import com.google.api.client.auth.oauth2.CredentialStore;
22+
import com.google.api.client.auth.oauth2.TokenRequest;
2123
import com.google.api.client.auth.oauth2.TokenResponse;
24+
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.Details;
2225
import com.google.api.client.http.GenericUrl;
2326
import com.google.api.client.http.HttpExecuteInterceptor;
27+
import com.google.api.client.http.HttpRequestInitializer;
2428
import com.google.api.client.http.HttpTransport;
2529
import com.google.api.client.http.HttpUnsuccessfulResponseHandler;
2630
import com.google.api.client.json.JsonFactory;
2731

32+
import java.util.List;
33+
2834
/**
2935
* Thread-safe Google-specific implementation of the OAuth 2.0 helper for accessing protected
3036
* resources using an access token, as well as optionally refreshing the access token when it
3137
* expires using a refresh token.
3238
*
3339
* <p>
40+
* It uses {@link BearerToken#authorizationHeaderAccessMethod()} as the access method,
41+
* {@link GoogleOAuthConstants#TOKEN_SERVER_URL} as the token server URL, and
42+
* {@link ClientParametersAuthentication} with the client ID and secret as the client authentication
43+
* (use {@link Builder#setClientSecrets(GoogleClientSecrets)} or
44+
* {@link Builder#setClientSecrets(String, String)}).
45+
* </p>
46+
*
47+
* <p>
3448
* Sample usage:
3549
* </p>
3650
*
3751
* <pre>
38-
public static HttpRequestFactory createRequestFactoryWithAccessTokenOnly(HttpTransport transport,
39-
JsonFactory jsonFactory, TokenResponse tokenResponse) {
40-
return transport.createRequestFactory(new GoogleCredential(tokenResponse.getAccessToken()));
52+
public static HttpRequestFactory createRequestFactoryWithAccessTokenOnly(
53+
HttpTransport transport, JsonFactory jsonFactory, TokenResponse tokenResponse) {
54+
return transport.createRequestFactory(
55+
new GoogleCredential().setFromTokenResponse(tokenResponse));
4156
}
4257
4358
public static HttpRequestFactory createRequestFactoryWithRefreshToken(HttpTransport transport,
44-
JsonFactory jsonFactory, TokenResponse tokenResponse) {
45-
return transport.createRequestFactory(new GoogleCredential(transport, jsonFactory,
46-
"s6BhdRkqt3", "7Fjfp0ZBr1KtDRbnfVdmIw", tokenResponse.getRefreshToken(), tokenResponse
47-
.getAccessToken()));
59+
JsonFactory jsonFactory, GoogleClientSecrets clientSecrets, TokenResponse tokenResponse) {
60+
return transport.createRequestFactory(new GoogleCredential.Builder().setTransport(transport)
61+
.setJsonFactory(jsonFactory)
62+
.setClientSecrets(clientSecrets)
63+
.build()
64+
.setFromTokenResponse(tokenResponse));
4865
}
4966
* </pre>
5067
*
5168
* <p>
52-
* If you need to persist the access token in a data store, override
53-
* {@link #onTokenResponse(TokenResponse)} and {@link #onTokenErrorResponse(TokenErrorResponse)}.
69+
* If you need to persist the access token in a data store, use {@link CredentialStore} and
70+
* {@link Builder#addRefreshListener(CredentialRefreshListener)}.
5471
* </p>
5572
*
5673
* <p>
@@ -64,21 +81,45 @@ public static HttpRequestFactory createRequestFactoryWithRefreshToken(HttpTransp
6481
*/
6582
public class GoogleCredential extends Credential {
6683

84+
/**
85+
* Constructor with the ability to access protected resources, but not refresh tokens.
86+
*
87+
* <p>
88+
* To use with the ability to refresh tokens, use {@link Builder}.
89+
* </p>
90+
*/
6791
public GoogleCredential() {
6892
super(BearerToken.authorizationHeaderAccessMethod());
6993
}
7094

7195
/**
72-
* @param transport HTTP transport for executing refresh token request
73-
* @param jsonFactory JSON factory to use for parsing response for refresh token request
74-
* @param clientId client identifier issued to the client during the registration process
75-
* @param clientSecret client secret
96+
* @param method method of presenting the access token to the resource server (for example
97+
* {@link BearerToken#authorizationHeaderAccessMethod})
98+
* @param transport HTTP transport for executing refresh token request or {@code null} if not
99+
* refreshing tokens
100+
* @param jsonFactory JSON factory to use for parsing response for refresh token request or
101+
* {@code null} if not refreshing tokens
102+
* @param tokenServerEncodedUrl encoded token server URL or {@code null} if not refreshing tokens
103+
* @param clientAuthentication client authentication or {@code null} for none (see
104+
* {@link TokenRequest#setClientAuthentication(HttpExecuteInterceptor)})
105+
* @param requestInitializer HTTP request initializer for refresh token requests to the token
106+
* server or {@code null} for none.
107+
* @param refreshListeners listeners for refresh token results or {@code null} for none
76108
*/
77-
public GoogleCredential(HttpTransport transport, JsonFactory jsonFactory, String clientId,
78-
String clientSecret) {
79-
super(BearerToken.authorizationHeaderAccessMethod(), transport, jsonFactory, new GenericUrl(
80-
GoogleOAuthConstants.TOKEN_SERVER_URL), new ClientParametersAuthentication(clientId,
81-
clientSecret));
109+
protected GoogleCredential(AccessMethod method,
110+
HttpTransport transport,
111+
JsonFactory jsonFactory,
112+
String tokenServerEncodedUrl,
113+
HttpExecuteInterceptor clientAuthentication,
114+
HttpRequestInitializer requestInitializer,
115+
List<CredentialRefreshListener> refreshListeners) {
116+
super(method,
117+
transport,
118+
jsonFactory,
119+
tokenServerEncodedUrl,
120+
clientAuthentication,
121+
requestInitializer,
122+
refreshListeners);
82123
}
83124

84125
@Override
@@ -91,8 +132,98 @@ public GoogleCredential setRefreshToken(String refreshToken) {
91132
return (GoogleCredential) super.setRefreshToken(refreshToken);
92133
}
93134

135+
@Override
136+
public GoogleCredential setExpirationTimeMilliseconds(Long expirationTimeMilliseconds) {
137+
return (GoogleCredential) super.setExpirationTimeMilliseconds(expirationTimeMilliseconds);
138+
}
139+
94140
@Override
95141
public GoogleCredential setExpiresInSeconds(Long expiresIn) {
96142
return (GoogleCredential) super.setExpiresInSeconds(expiresIn);
97143
}
144+
145+
@Override
146+
public GoogleCredential setFromTokenResponse(TokenResponse tokenResponse) {
147+
return (GoogleCredential) super.setFromTokenResponse(tokenResponse);
148+
}
149+
150+
/**
151+
* Google credential builder.
152+
*
153+
* <p>
154+
* Implementation is not thread-safe.
155+
* </p>
156+
*/
157+
public static class Builder extends Credential.Builder {
158+
159+
public Builder() {
160+
super(BearerToken.authorizationHeaderAccessMethod());
161+
setTokenServerEncodedUrl(GoogleOAuthConstants.TOKEN_SERVER_URL);
162+
}
163+
164+
@Override
165+
public GoogleCredential build() {
166+
return new GoogleCredential(getMethod(),
167+
getTransport(),
168+
getJsonFactory(),
169+
getTokenServerUrl() == null ? null : getTokenServerUrl().build(),
170+
getClientAuthentication(),
171+
getRequestInitializer(),
172+
getRefreshListeners());
173+
}
174+
175+
@Override
176+
public Builder setTransport(HttpTransport transport) {
177+
return (Builder) super.setTransport(transport);
178+
}
179+
180+
@Override
181+
public Builder setJsonFactory(JsonFactory jsonFactory) {
182+
return (Builder) super.setJsonFactory(jsonFactory);
183+
}
184+
185+
/** Sets the client identifier and secret. */
186+
public Builder setClientSecrets(String clientId, String clientSecret) {
187+
setClientAuthentication(new ClientParametersAuthentication(clientId, clientSecret));
188+
return this;
189+
}
190+
191+
/** Sets the client secrets. */
192+
public Builder setClientSecrets(GoogleClientSecrets clientSecrets) {
193+
Details details = clientSecrets.getDetails();
194+
setClientAuthentication(
195+
new ClientParametersAuthentication(details.getClientId(), details.getClientSecret()));
196+
return this;
197+
}
198+
199+
@Override
200+
public Builder setRequestInitializer(HttpRequestInitializer requestInitializer) {
201+
return (Builder) super.setRequestInitializer(requestInitializer);
202+
}
203+
204+
@Override
205+
public Builder addRefreshListener(CredentialRefreshListener refreshListener) {
206+
return (Builder) super.addRefreshListener(refreshListener);
207+
}
208+
209+
@Override
210+
public Builder setRefreshListeners(List<CredentialRefreshListener> refreshListeners) {
211+
return (Builder) super.setRefreshListeners(refreshListeners);
212+
}
213+
214+
@Override
215+
public Builder setTokenServerUrl(GenericUrl tokenServerUrl) {
216+
return (Builder) super.setTokenServerUrl(tokenServerUrl);
217+
}
218+
219+
@Override
220+
public Builder setTokenServerEncodedUrl(String tokenServerEncodedUrl) {
221+
return (Builder) super.setTokenServerEncodedUrl(tokenServerEncodedUrl);
222+
}
223+
224+
@Override
225+
public Builder setClientAuthentication(HttpExecuteInterceptor clientAuthentication) {
226+
return (Builder) super.setClientAuthentication(clientAuthentication);
227+
}
228+
}
98229
}

0 commit comments

Comments
 (0)