Ошибка проверки JWT: BAD_SIGNATURE - PullRequest
0 голосов
/ 24 июня 2018

Я использую следующий файл для решения проблемы

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.

Спасибо.

1 Ответ

0 голосов
/ 24 июня 2018

Если не ошибаюсь, вы ищете реализацию Java JWT .

Для генерации и проверки токена JWT требуется минимум Algorithm и Secret key.

Использую Java-реализацию JWT

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.0</version>
</dependency>

Файл класса

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;


...


    public String generateToken(String username) {
        String audience = generateAudience();
        return Jwts.builder()
                .setIssuer( APP_NAME )
                .setSubject(username)
                .setAudience(audience)
                .setIssuedAt(timeProvider.now())
                .setExpiration(generateExpirationDate())
                .signWith( SIGNATURE_ALGORITHM, SECRET )
                .compact();
    }



    private Claims getAllClaimsFromToken(String token) {
        Claims claims;
        try {
            claims = Jwts.parser()
                    .setSigningKey(SECRET)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            LOGGER.error("Could not get all claims Token from passed token");
            claims = null;
        }
        return claims;
    }

Здесь generateToken будет принимать все детали заявки вместе с секретным ключом и алгоритмом.

getAllClaimsFromToken используется для чтения подробностей из токена. Это в основном подтверждает токен. Если возникнет какая-либо ошибка, будет сгенерировано исключение соответственно

Я написал ответ для этого. Это рабочий код. Вы можете обратиться к TokenHelper.java, чтобы получить более подробную информацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...