2

我有一个试图获取令牌的控制器。

当我在视图 PRETTY 中执行它时,我在邮递员中收到此错误

意外的“e”

但是如果我去查看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 控制器,但我总是使用响应参数中的消息进入 onError 方法。

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

更新

我解决了这个问题。我仍然认为我最初这样做的方式也应该有效,但我仍然不明白为什么我会收到错误。

我创建了一个名为 Token 的 pojo,其属性标记为 String,然后我更改了它

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

对此:

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

这是我返回真实 json 对象的解决方法。

4

1 回答 1

0

我知道现在为时已晚,但我遇到了同样的问题并用你的解决方案解决了它,所以谢谢。

只是为了以后遇到这个问题的人。就我而言,我这样做。

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 将知道响应是字符串类型的,它不会再尝试将其解析为对象。

于 2021-06-10T13:55:24.330 回答