Служба доменов с широким диапазоном доменов службы поддержки Google Service использует учетную запись службы JSON вместо p12
Я могу использовать учетную запись Google Service с делегированием домена с использованием файла ключа .p12.
Я хотел бы использовать файл ключа JSON вместо файла p12, но я не могу понять, как установить идентификатор учетной записи службы при использовании ключа JSON.
Как вы установите для пользователя, чтобы он выдавал себя за использование файла ключа JSON?
Работает нормально:
File p12File = new File(...);
GoogleCredential.Builder b = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY).setServiceAccountId(properties.getServiceAccountId())
.setServiceAccountPrivateKey(SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(),
new FileInputStream(p12File), "notasecret",
"privatekey", "notasecret"))
.setServiceAccountScopes(GOOGLE_SCOPE_LIST);
if (properties.getServiceAccountEmail() != null) {
b = b.setServiceAccountUser(properties.getServiceAccountEmail());
}
credential = b.build();
Не работает:
String jsonKeyContents = "{\n" +
" \"type\": \"service_account\",\n" +
" \"project_id\": \"sxxxxxxx0\",\n" +
" \"private_key_id\": \"csxxxxxxxxxxxxxxxx\",\n" +
" \"private_key\": \"-----BEGIN PRIVATE " +
"KEY-----\\nMIIxxxxxxxxxxsTbwzsbw" +
"==\\n-----END PRIVATE KEY-----\\n\",\n" +
" \"client_email\": \"[email protected]\",\n" +
" \"client_id\": \"1111111111111111111\",\n" +
" \"auth_uri\": \"https://accounts.google.com/o/oauth2/auth\",\n" +
" \"token_uri\": \"https://accounts.google.com/o/oauth2/token\",\n" +
" \"auth_provider_x509_cert_url\": \"https://www.googleapis.com/oauth2/v1/certs\",\n" +
" \"client_x509_cert_url\": \"https://www.googleapis" +
".com/robot/v1/metadata/x509/xxxxx%40xxxxxx-xxxxx-123456.iam.gserviceaccount.com\"\n" +
"}";
try (InputStream privateKeyInputStream = new ByteArrayInputStream(jsonKeyContents
.getBytes("UTF-8") )) {
credential = GoogleCredential.fromStream(privateKeyInputStream).createScoped(GOOGLE_SCOPE_LIST);
}
При использовании ключа JSON для использования Directory API для отображения списка всех пользователей Enterprise появляется сообщение об ошибке:
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
{
"code" : 404,
"errors" : [ {
"domain" : "global",
"message" : "Domain not found.",
"reason" : "notFound"
} ],
"message" : "Domain not found."
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
...
Все проблемы, по-видимому, связаны с тем, что нет места для отправки электронной почты учетной записи службы.
Что мне здесь не хватает? Есть ли кто-нибудь, у кого есть рабочий пример, для обмена некоторым кодом?
Ответы
Ответ 1
После всего этого я сам нашел ответ.
См. https://github.com/google/google-api-java-client/issues/1007#issuecomment-264157989
Чтобы исправить это:
-
Создайте GoogleCredential credentialFromJson
с помощью ключа JSON, как указано выше. То есть credential = GoogleCredential.fromStream(privateKeyInputStream).createScoped(GOOGLE_SCOPE_LIST)
-
Создайте построитель, используя код, в котором мы использовали P12, но вместо создания закрытого ключа из файла p12... используйте эту строку: .setServiceAccountPrivateKey(credentialFromJson.getServiceAccountPrivateKey())
Теперь это работает!\Т/
Ответ 2
Ваш JSON файл должен содержать все необходимые пары значений ключа в качестве
следующий ключ
{
"type": "service_account",
"project_id": "your project Id",
"private_key_id": "private key id",
"private_key": "Private key",
"client_email": "Client email ending with .iam.gserviceaccount.com",
"client_id": "client -id",
"auth_uri": "accounts.google.com/o/oauth2/auth",
"token_uri": "accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "www.googleapis.com/robot/v1/metadata/x509/?????
-170710.iam.gserviceaccount.com"
}
Затем используйте следующий код:
private GoogleCredential authorize1() {
GoogleCredential credential = null;
HttpTransport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
try {
InputStream jsonFileStream =
DriveSample.class.getClassLoader().getResourceAsStream("client_secrets.json");
GoogleCredential readJsonFile = GoogleCredential
.fromStream(jsonFileStream, httpTransport, JSON_FACTORY).createScoped(DriveScopes.all());
credential = new GoogleCredential.Builder().setTransport(readJsonFile.getTransport())
.setJsonFactory(readJsonFile.getJsonFactory())
.setServiceAccountId(readJsonFile.getServiceAccountId())
.setServiceAccountScopes(readJsonFile.getServiceAccountScopes())
.setServiceAccountPrivateKey(readJsonFile.getServiceAccountPrivateKey()).build();
} catch (IOException exception) {
exception.printStackTrace();
}
return credential;
}