我已经编写了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数据的完整性吗?
答案 0 :(得分:0)
在进一步研究中,我发现authorizationHeader和identificationHeader值实际上并没有像我期望的那样是Base64编码的。
我删除了对JWT.decode()的调用,然后在一个句点(。)上分割了IdentificationHeader的内容,该句点返回了三个JWT组件。然后,我能够简单地将其中一个字符串解析为JSON并检索必要的JWT声明。