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: