To validate JWT token you may use filters:
It could be something like this:
// AuthFilterGroup.h
class AuthFilterGroup: public ngrest::FilterGroup
{
public:
    AuthFilterGroup();
    ~AuthFilterGroup();
    const std::string& getName() const override;
    const ngrest::FiltersMap& getFilters() const override;
private:
    ngrest::FiltersMap filters;
};
// AuthFilterGroup.cpp
#include "AuthFilterGroup.h"
NGREST_DECLARE_PLUGIN(::ngrest::AuthFilterGroup)
class JwtFilter: public ngrest::Filter
{
public:
    void filter(Phase /*phase*/, MessageContext* context) override
    {
        ngrest::Header* authHeader = context->request->getHeader("Authorization");
        if (!authHeader || !authHeader->value) {
            NGREST_THROW_HTTP("No 'Authorization' header provided", HTTP_STATUS_401_UNAUTHORIZED);
        }
        
        std::string bearer(authHeader->value);
        // TODO validate bearer JWT token
    }
    const std::string& getName() const override
    {
        return name;
    }
    const std::list<std::string>& getDependencies() const override
    {
        return deps;
    }
private:
    std::string name = "JwtFilter";
    std::list<std::string> deps;
};
AuthFilterGroup::AuthFilterGroup():
  filters({
      {ngrest::Phase::Header, { new JwtFilter() }}
  })
{
}
AuthFilterGroup::~AuthFilterGroup()
{
    for (auto it : filters)
        for (ngrest::Filter* filter : it.second)
            delete filter;
    filters.clear();
}
const std::string& AuthFilterGroup::getName() const
{
    static const std::string name = "AuthFilterGroup";
    return name;
}
const ngrest::FiltersMap& AuthFilterGroup::getFilters() const
{
    return filters;
}
}
For a complete example of filter, please see: