JWT.decode(令牌)静默失败

时间:2019-01-17 22:47:29

标签: java jwt azure-active-directory auth0 grizzly

我已经编写了JAX-RS ContainerRequestFilter来在一组REST服务上实现基于JWT的访问控制,但是应用程序无法解码JWT id_token。

我的Web客户端成功执行Azure AD登录过程,并获取JWT id_token,然后请求并接收JWT access_token。

在我的服务器上,我正在使用https://github.com/auth0/java-jwt库对id_token进行解码,但是对的调用

    DecodedJWT jwtIdent = JWT.decode(identificationHeader); 

失败,无任何例外。

我有一个简单的Java程序,可以从Web服务器对相同id_token的String版本执行相同的JWT.decode(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数据从客户端传输到服务器时,我还需要采取其他措施来保护UTF-8数据的完整性吗?

1 个答案:

答案 0 :(得分:0)

在进一步研究中,我发现authorizationHeader和identificationHeader值实际上并没有像我期望的那样是Base64编码的。

我删除了对JWT.decode()的调用,然后在一个句点(。)上分割了IdentificationHeader的内容,该句点返回了三个JWT组件。然后,我能够简单地将其中一个字符串解析为JSON并检索必要的JWT声明。