mirror of
https://github.com/google/nomulus.git
synced 2025-05-01 20:47:52 +02:00
RemoteApiOption has a package-private method that takes a Stream representing the content of a JSON and use a GoogleCredential created from it as its credential. This CL uses reflection to change the access modifier of that method in order to supply a credential stream that is self-managed. This is obviously not ideal and prone to breakage in case the getGoogleCredentialStream method is changed. Unfortunately upstream is not willing to make it public citing the reason that GoogleCredential.fromStream() (which getGoogleCredentialStream uses) is a @Beta annotated function (see https://groups.google.com[]forum/#!searchin/domain-registry-eng/remoteapioptions%7Csort:date/domain-registry-eng/Flsah6skszQ/CySZv2XEBwAJ). However this function is introduced 5 years ago as a public function (b857184bfa
). I think at this point it is safe to assume that it is part of the widely used APIs and will not change without sufficient notice.
Note here that RemoteApiOptions creates its own copy of GoogleCredential to be used to call App Engine APIs locally, whereas communications to Nomulus endpoints use the Credential provided in AuthModule. Even though both credentials are created from the same client id, client secret and refresh token (the three elements needed to construct a GoogleCredential this way, see https://github.com/googleapis/google-api-java-client/blob/master/google-api-client/src/main/java/com/google/api/client/googleapis/auth/oauth2/GoogleCredential.java#L842), their refreshes cycles are independent of each other. I verified that refreshing one of the credential does not invalidate the access token of the other credential, as long as it is not expired yet.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=224156131
43 lines
1.7 KiB
Java
43 lines
1.7 KiB
Java
// Copyright 2018 The Nomulus Authors. All Rights Reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package google.registry.tools;
|
|
|
|
import static com.google.common.base.Preconditions.checkState;
|
|
|
|
import com.google.appengine.tools.remoteapi.RemoteApiOptions;
|
|
import java.io.InputStream;
|
|
import java.lang.reflect.Method;
|
|
|
|
/**
|
|
* Provides a method to access {@link RemoteApiOptions#useGoogleCredentialStream(InputStream)},
|
|
* which is a package private method.
|
|
*
|
|
* <p>This is obviously a hack, but until that method is exposed, we have to do this to set up the
|
|
* {@link RemoteApiOptions} with a JSON representing a user credential.
|
|
*/
|
|
public class RemoteApiOptionsUtil {
|
|
static RemoteApiOptions useGoogleCredentialStream(RemoteApiOptions options, InputStream stream)
|
|
throws Exception {
|
|
Method method =
|
|
options.getClass().getDeclaredMethod("useGoogleCredentialStream", InputStream.class);
|
|
checkState(
|
|
!method.isAccessible(),
|
|
"RemoteApiOptoins#useGoogleCredentialStream(InputStream) is accessible."
|
|
+ " Stop using RemoteApiOptionsUtil.");
|
|
method.setAccessible(true);
|
|
method.invoke(options, stream);
|
|
return options;
|
|
}
|
|
}
|