Web-токен JSON - jose4j - SyntaxError: неожиданный токен e в JSON в позиции 0

У меня есть контроллер, который пытается получить токен.

Я получил эту ошибку в почтальоне, когда я выполняю ее в представлении PRETTY

Неожиданное "е"

Но если я перейду к представлению RAW, я смогу увидеть токен вот так.

eyJraWQiOiIxIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJJc3N1ZXIiLCJhdWQiOiJBdWRpZW5jZSIsImV4cCI6MTQ3NTQ1OTMyNiwianRpIjoiTmF3d000bDVGRmFRZ0dBQkwzS3N5USIsImlhdCI6MTQ3NTQ1ODcyNiwibmJmIjoxNDc1NDU4NjA2LCJzdWIiOiJzdWJqZWN0IiwiZW1haWwiOiJtYWlsQGV4YW1wbGUuY29tIn0.f97SFDaAjUyUDK_UQgwgnCTewd0yw6tWK6DFLzpALFq177f1QMTYPbVdiIG1ViJ0FNJ6fUCleCd8BmrToUn25VSmRv799dtcz-xaN1kOgw90NQ00kPUhnDXG01-7hImkHfbmZZWORukP2yPK1sHWzpdjg9fJOvRZpZ6ZWli4HeuYRJqsFOv7PvwmGH9JnfRTf_2tboL-oAYBpT367eh60TggrvMgmrO_Taj5M7qGG0GpbwuVh_HTAkaKv7T2WmuZ2JPANhe5JvY_DDaqChtwd0IPREAhK3Xr-nTOIuwbQ0Y1hhOGfvDmikQj6DXnCERYixP6eR1dhC8n3bKvXyaVmA

Это код моего контроллера.

@Path("/demo")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response testMethod() throws JSONException, IOException {
    RsaJsonWebKey rsaJsonWebKey = RsaJwkGenerator.generateJwk(2048);
    rsaJsonWebKey.setKeyId("k1");
    JwtClaims claims = new JwtClaims();
    claims.setIssuer("Issuer");  
    claims.setAudience("Audience");
    claims.setExpirationTimeMinutesInTheFuture(10);    
    claims.setGeneratedJwtId(); 
    claims.setIssuedAtToNow();
    claims.setNotBeforeMinutesInThePast(2); 
    claims.setSubject("subject"); 
    claims.setClaim("email","mail@example.com"); 
    JsonWebSignature jws = new JsonWebSignature();

    jws.setPayload(claims.toJson());
    jws.setKey(rsaJsonWebKey.getPrivateKey());
    jws.setKeyIdHeaderValue(rsaJsonWebKey.getKeyId());

    jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);

    String jwt = jws.getCompactSerialization();
    if(jwt == null){
        return Response.status(204).entity(jwt).build();
    }
    return Response.status(200).entity(jwt).build();
}

Я игнорирую ошибку в почтальоне, но получаю ту же ошибку при попытке выполнить ее в Chrome.

Я пытаюсь вызвать мой контроллер RESTful с помощью angular, как это, но я всегда получаю метод onError с сообщением в параметре response.

angular.min.js:118 SyntaxError: Unexpected token e in JSON at position 0

Это код в угловых

app.service('TokenService', function($http){
    this.getToken = function(){
      function onSuccess(response){
          console.log('got it');
      }

      function onError(response){
          console.log('fail');
      }

      return $http({
          method : 'GET',
          url : 'http:localhost:8080/rest/demo',
          header: {'Content-Type' : 'application/json'}
      }).then(onSuccess, onError);
    }
}

Моя ссылка на код для токена отсюда с Jose4j

ОБНОВИТЬ

Я решил это. Я все еще думаю, что способ, которым я сделал это первоначально, должен также работать, но я все еще не понимаю, почему я получаю ошибку.

Я создал Pojo с именем Token с токеном свойства String, затем я изменил это

return Response.status(200).entity(jwt).build();

к этому:

Token token = new Token();
token.setToken(jwt);
return Response.status(200).entity(token).build();

Это мой обходной путь для возврата реального объекта json.

1 ответ

Я знаю, что уже слишком поздно, но я столкнулся с той же проблемой и решил ее с помощью вашего решения, поэтому спасибо.

Просто ради тех, кто потом сталкивался с этой проблемой. В моем случае я делаю это так.

      HashMap<String, String> credential = new HashMap<>();
credential.put("token", jwtToken);
apiResp = ResponseEntity.ok(jwtToken);

Кстати, я также, кажется, понял проблему, которая связана с Angular, может ожидать, что ответ от сервера по умолчанию является объектом JSON, а затем проанализирует его на объект JavaScript для нас. Итак, мы получили нашу ошибку, потому что мы возвращаем строку как объект ответа, и он не может преобразовать строку в объект. Вот почему размещение токена в POJO решило эту проблему.

Другой способ - установить тип возвращаемого значения на стороне клиента следующим образом.

      login(username: string, password: string): Observable<any> {
    let body = {username, password};
    let res = this.http.post(
      `${API.AUTHENTICATION}`, body, {
        responseType: 'text'
      });
  
    return res;
  }

Теперь JS будет знать, что ответ имеет строковый тип, и больше не будет пытаться преобразовать его в объект.

Другие вопросы по тегам