Я написал 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 при их передаче от моего клиента к моему серверу?