2

JAX-RS Web サービスからJWTを返そうとしましたが、次のエラーが発生しました:

SyntaxError: Unexpected token t
    at Object.parse (native)
    at fromJson (http://localhost:9081/FoodView/resources/bower_components/angular/angular.js:1250:14)
    at defaultHttpResponseTransform (http://localhost:9081/FoodView/resources/bower_components/angular/angular.js:9371:16)
    at http://localhost:9081/FoodView/resources/bower_components/angular/angular.js:9462:12
    at forEach (http://localhost:9081/FoodView/resources/bower_components/angular/angular.js:336:20)
    at transformData (http://localhost:9081/FoodView/resources/bower_components/angular/angular.js:9461:3)
    at transformResponse (http://localhost:9081/FoodView/resources/bower_components/angular/angular.js:10241:23)
    at processQueue (http://localhost:9081/FoodView/resources/bower_components/angular/angular.js:14634:28)
    at http://localhost:9081/FoodView/resources/bower_components/angular/angular.js:14650:27
    at Scope.$get.Scope.$eval (http://localhost:9081/FoodView/resources/bower_components/angular/angular.js:15916:28)

これは、LoginControllerログインを実行しようとするコードです。

app.controller('LoginController', function($scope, $log, $auth){
    $scope.login = function() {
          $auth.login($scope.user)
            .then(function() {
              $log.info('You have successfully signed in');
              $location.path('/');
            })
            .catch(function(response) {
                $log.info(response.data, response.status);
            });
        };

});

これは JWT トークンを発行する JAX-RS Web サービス コードで、JWT を生成するためにjose.4.jライブラリを使用しています。

@POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response mergeInfo(String json){
        Gson gson = new GsonBuilder()
        .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")
        .setPrettyPrinting().create();

        System.out.println(json);

        String serializedJwe = null;
        try {
             Key key = new AesKey(ByteUtil.randomBytes(16));
             JsonWebEncryption jwe = new JsonWebEncryption();
             jwe.setPayload("Hello World!");
             jwe.setAlgorithmHeaderValue(KeyManagementAlgorithmIdentifiers.A128KW);
             jwe.setEncryptionMethodHeaderParameter(ContentEncryptionAlgorithmIdentifiers.AES_128_CBC_HMAC_SHA_256);
             jwe.setKey(key);
             serializedJwe = jwe.getCompactSerialization();
             System.out.println("Serialized Encrypted JWE: " + serializedJwe);
             jwe = new JsonWebEncryption();
             jwe.setKey(key);
             jwe.setCompactSerialization(serializedJwe);
             System.out.println("Payload: " + jwe.getPayload());
        } catch (Exception e) {
            e.printStackTrace();
        }

        String token = "{token: " + serializedJwe + "}";

        return Response.ok(token).build();

    }

生成された JWT を返す形式/方法が間違っていると思いますが、修正方法がわかりません。ありがとうございました。

4

1 に答える 1

1

うまくいかなかった理由がわかりました。JSON 文字列の形式が間違っていました。

これは、json に解析するための正しい文字列var test = '{"token":"test"}' です。実行すると、次のJSON.parse(test)ようになります。Object {token: "test"}

しかし!このような文字列を使用var test = "{'token':'test'}"して JavaScript オブジェクトに解析すると、次のようになります。Uncaught SyntaxError: Unexpected token '

そこで、Java アプリケーションで次のクラスを作成しました。

public class Token {
    private String token;

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }
}

そして、コードの最後の 3 行を次のように変更しました。

        Token token = new Token();
        token.setToken(serializedJwe);

        return Response.ok(gson.toJson(token)).build();

これで、すべてが期待どおりに機能します。

于 2015-08-26T08:26:27.380 に答える