Я использую следующий файл для решения проблемы
https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/appengine-java8/appidentity/src/main/java/com/example/appengine/appidentity/SignForAppServlet.java
Написать метод теста для генерации подписанного JWT с использованием учетной записи службы по умолчанию для ядра приложения
private String test() throws CertificateException, UnsupportedEncodingException,
NoSuchAlgorithmException, InvalidKeyException, SignatureException {
long now = System.currentTimeMillis() / 1000;
JSONObject headerJson = new JSONObject();
headerJson.put("typ", "JWT");
headerJson.put("alg", "RS256");
JSONObject payloadJson = new JSONObject();
payloadJson.put("iat", now);
payloadJson.put("exp", now + 3600);
payloadJson.put("iss", "{test-project}@appspot.gserviceaccount.com");
payloadJson.put("sub", "{test-project}@appspot.gserviceaccount.com");
payloadJson.put("aud", "https://echo-api.endpoints.{test-project}.cloud.goog");
String headerAndPayload = String.format("%s.%s", Base64.getUrlEncoder().encodeToString(headerJson.toString().getBytes()), Base64.getUrlEncoder().encodeToString(payloadJson.toString().getBytes()));
AppIdentityService appIdentityService = AppIdentityServiceFactory.getAppIdentityService();
AppIdentityService.SigningResult signingResult = appIdentityService.signForApp(headerAndPayload.getBytes());
String signedJwt = String.format("%s.%s", headerAndPayload , new
String(Base64.getUrlEncoder().encode(signingResult.getSignature())));
return signedJwt;
}
Мне нужно сгенерировать подписанный JWT для аутентификации Java-сервера, работающего в ядре приложения. API защищен с помощью оконечных точек открытого облака API. Ниже мой openapi.yaml
swagger: "2.0"
info:
description: "A simple Google Cloud Endpoints API example."
title: "Endpoints Example"
version: "1.0.0"
host: "echo-api.endpoints.{test-project}.cloud.goog"
consumes:
- "application/json"
produces:
- "application/json"
schemes:
- "https"
paths:
"/test/echo":
post:
description: "Echo back a given message."
operationId: "echo"
produces:
- "application/json"
responses:
200:
description: "Echo"
schema:
$ref: "#/definitions/echoMessage"
parameters:
-
description: "Message to echo"
in: body
name: message
required: true
schema:
$ref: "#/definitions/echoMessage"
security:
- api_key: []
google_jwt: []
definitions:
echoMessage:
type: "object"
properties:
message:
type: "string"
securityDefinitions:
google_jwt:
authorizationUrl: ""
flow: "implicit"
type: "oauth2"
x-google-issuer: "stl-cardio-dev@appspot.gserviceaccount.com"
x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/jwk/{test-project}@appspot.gserviceaccount.com"
После создания JWT я попытался получить доступ к / test / echo, получив сообщение «Ошибка проверки JWT: BAD_SIGNATURE».
Я пытался использовать клиент Python, описанный в
https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/endpoints/getting-started/clients/service_to_service_gae_default/main.py
Я использую следующие «заголовок и полезная нагрузка» и «метод подписи», я получил следующие результаты.
(01). python header_and_payload + python app_identity.sign_blob method => Успех
(02). python header_and_payload + java appIdentity.signForApp () => Ошибка
(03). java headerAndPayload + python app_identity.sign_blob method => Успех
(04). java headerAndPayload + java appIdentity.signForApp () => Ошибка
Я вижу проблему в результате appIdentity.signForApp () в моей реализации Java.
Я не могу найти полный пример или документацию. Как я генерирую правильный подписанный JWT, используя Java.
Спасибо.