Jaspic: обрабатывать доступ к защищенному ресурсу
Я (все еще) изучаю JASPIC, провожу несколько экспериментов на простом проекте: этот. Когда я вызываю защищенные ресурсы ServerAuthModule
проверяет учетные данные через validateRequest
и возвращается AuthStatus.SUCCESS
, HTTP-ответ - 200, но он пуст. Я использую эти два curl
Команды для тестирования:
curl -H "Content-Type: application/json" -X POST -d '{"username":"xxx","password":"xxx"}' http://localhost:8080/JaspicWeb/services/user/login
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0NzE0NzE1ODcsInN1YiI6InVzZXJBIn0.Gyf7w2192vlz3uSwjwtf8z1p9n9k3IqtQMQrubA7oYI" -X GET http://localhost:8080/JaspicWeb/services/user/userA
Первая команда - получить токен, использованный во второй. Я использую Jaspic с Wildfly10 и RestEasy.
Обновление: я обновил связанный проект. Сейчас это полноценный рабочий Jaspic
пример.
1 ответ
СЭМ CallbackHandler
является причиной ваших неприятностей.
Первый it.jaspic.sec.TokenConfigProvider
игнорирует обработчик, переданный ему во время выполнения:
public ServerAuthConfig getServerAuthConfig(String layer, String appContext, CallbackHandler handler) throws AuthException {
return serverAuthConfig;
}
затем it.jaspic.sec.TokenServerConfig
использует свой собственный обработчик, который в основном ничего не делает:
public TokenServerConfig() throws AuthException {
// ...
handler = new CallbackHandler() {
@Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
// just logs its arguments
}
};
}
Как следствие, it.jaspic.sec.TokenSAM#validateRequest
не может сообщить личность вызывающего абонента среде выполнения. Так как он по-прежнему ошибочно возвращается AuthStatus.SUCCESS
тем не менее, это довольно неопределенное поведение с этого момента, по крайней мере, в отношении JASPIC. Забавно, как будто контейнер сервлетов пытался сделать так, чтобы обе стороны были довольны в этом случае, чествуя оба SAM. AuthStatus
что предполагает успешный обмен сообщениями аутентификации, с одной стороны, а также приложения <security-constraint>
с другой. По общему признанию, 401
, 403
или, может быть, еще лучше, 500
ответ - указывающий на механизм аутентификации, не подчиняющийся его контракту - мог бы быть менее запутанным.
Очевидное решение - передать обработчик, предоставленный во время выполнения, SAM. Очевидно, что API не очень помогает, но для случая использования одного уровня сообщений / одного приложения / одного механизма аутентификации должно быть достаточно просто лениво создать экземпляр ServerAuthConfig
с обработчиком, когда он впервые запрашивается во время выполнения через getServerAuthConfig
вызов:
public synchronized ServerAuthConfig getServerAuthConfig(String layer, String appContext, CallbackHandler handler) {
if (serverAuthConfig == null) {
serverAuthConfig = new TokenServerConfig(handler);
}
return serverAuthConfig;
}
И, конечно же, новый конструктор, названный выше (который должен только хранить аргумент обработчика), должен быть введен в it.jaspic.sec.TokenServerConfig
,
Эти два изменения должны сделать /services/user/userA
конечная точка доступна.