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 конечная точка доступна.

Другие вопросы по тегам