1717import com .google .api .client .auth .oauth2 .BearerToken ;
1818import com .google .api .client .auth .oauth2 .ClientParametersAuthentication ;
1919import 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 ;
2123import com .google .api .client .auth .oauth2 .TokenResponse ;
24+ import com .google .api .client .googleapis .auth .oauth2 .GoogleClientSecrets .Details ;
2225import com .google .api .client .http .GenericUrl ;
2326import com .google .api .client .http .HttpExecuteInterceptor ;
27+ import com .google .api .client .http .HttpRequestInitializer ;
2428import com .google .api .client .http .HttpTransport ;
2529import com .google .api .client .http .HttpUnsuccessfulResponseHandler ;
2630import 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 */
6582public 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