JWT.decode (токен) молча терпит неудачу - PullRequest
0 голосов
/ 18 января 2019

Я написал JAX-RS ContainerRequestFilter для реализации управления доступом на основе JWT для набора служб REST, но приложению не удалось декодировать идентификатор id_token JWT.

Мой веб-клиент успешно выполняет процесс входа в Azure AD и возвращает id_token JWT, а затем запрашивает и получает access_token JWT.

На моем сервере я использую библиотеку https://github.com/auth0/java-jwt для декодирования id_token, но при вызове

    DecodedJWT jwtIdent = JWT.decode(identificationHeader); 
Сбой

без каких-либо исключений.

У меня есть простая Java-программа, которая выполняет тот же вызов JWT.decode (id_token) для строковой версии того же id_token с веб-сервера, и этот вызов работает нормально.

Объект http-запроса от клиента:

    var request = {
        method: 'POST',
        url: url,
        headers: {
            'Content-Type': 'application/json;charset=utf-8',
            'Authorization': "Bearer " + $scope.tokens.accessToken,
            'Identification': $scope.tokens.idToken
        }
    };

Вершина ContainerRequestFilter выглядит следующим образом:

    public void filter(ContainerRequestContext requestContext) throws IOException {

logger.info("public void filter(ContainerRequestContext requestContext) - Begin");

    // Get the HTTP Authorization header from the request
    String authorizationHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);
    String identificationHeader = requestContext.getHeaderString(IDENTIFICATION_PROPERTY);        

    try {

        Method method = resourceInfo.getResourceMethod();
        logger.info("REST Method Called: " + method.getName());

        // Is access allowed for all?
        if( ! method.isAnnotationPresent(PermitAll.class)) {                

            // Is access denied for all?
            if(method.isAnnotationPresent(DenyAll.class)) {
                logger.info("Method: " + method.getName() + " has protections " + DenyAll.class.getName());
                logger.info("ACCESS_FORBIDDEN");
                requestContext.abortWith(ACCESS_FORBIDDEN);
                return;
            }                

            if (authorizationHeader == null) {
                logger.info(HttpHeaders.AUTHORIZATION + " = <null>");
                requestContext.abortWith(BAD_REQUEST);
            }                

            if (identificationHeader == null) {
                logger.info(IDENTIFICATION_PROPERTY +" = <null>");
                requestContext.abortWith(BAD_REQUEST);
            }

            logger.info("IdentificationHeader: \n   <" + identificationHeader + ">\n\n");

            DecodedJWT jwtIdent = JWT.decode(identificationHeader);

Вызов JWT.decode (...) происходит, но никогда не возвращается, и клиент получает код ошибки "500".

Я могу System.out.println (...) токены, когда они поступают на сервер, и они выглядят нормально. Я могу вставить их в другое Java-приложение, и они отлично декодируются, а они прекрасно декодируются в https://jwt.io/.

Есть ли что-то еще, что мне нужно сделать, чтобы защитить целостность данных UTF-8 при их передаче от моего клиента к моему серверу?

1 Ответ

0 голосов
/ 20 января 2019

После дальнейших исследований я выяснил, что значения authorizationHeader и идентификацииHeader на самом деле не были закодированы в Base64, как я ожидал.

Я удалил вызов JWT.decode (), а затем разделил содержимое идентификацииHeader на период ('.'), Который возвращает три компонента JWT. После этого я смог просто проанализировать одну из строк как JSON и получить необходимые утверждения JWT.

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