//! \addtogroup HTTPServer
//! \~\file pihttpserverbearerauth.h
//! \brief HTTP server with per-route HTTP Bearer authentication
//! \~english HTTP server with per-route HTTP Bearer authentication
//! \~russian HTTP-сервер с HTTP Bearer-аутентификацией по маршрутам
/*
PIP - Platform Independent Primitives
HTTP server with per-route HTTP Bearer authentication
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see .
*/
#ifndef PIHTTPSERVERBEARERAUTH_H
#define PIHTTPSERVERBEARERAUTH_H
#include "pihttpserverprotected.h"
//! \~\ingroup HTTPServer
//! \~\brief
//! \~english Protected HTTP server that checks the \c Authorization header with the Bearer scheme
//! and an external token validator.
//! \~russian Защищенный HTTP-сервер, проверяющий заголовок \c Authorization со схемой Bearer
//! и внешним валидатором токена.
class PIP_HTTP_SERVER_EXPORT PIHTTPServerBearerAuth: public PIHTTPServerProtected {
PIOBJECT_SUBCLASS(PIHTTPServerBearerAuth, PIHTTPServerProtected)
public:
//! \~english Creates a Bearer-auth server with the default realm.
//! \~russian Создает сервер Bearer-аутентификации с realm по умолчанию.
PIHTTPServerBearerAuth();
//! \~english Sets the token validator: receives the Bearer token of the request and
//! returns the \c AuthInfo of the request. The access is denied when the validator returns
//! an \c AuthInfo with \c authorized \c false.
//! \~russian Устанавливает валидатор токена: получает токен Bearer-аутентификации запроса
//! и возвращает \c AuthInfo запроса. Доступ запрещается, когда валидатор возвращает
//! \c AuthInfo с \c authorized \c false.
void setBearerAuthCallback(std::function c) { callback_auth = std::move(c); }
//! \~english Sets the realm used in the \c WWW-Authenticate challenge (default \c "Restricted").
//! \~russian Устанавливает realm, используемый в challenge \c WWW-Authenticate (по умолчанию \c "Restricted").
void setRealm(const PIString & r) { auth_realm = r; }
//! \~english Returns the realm used in the \c WWW-Authenticate challenge.
//! \~russian Возвращает realm, используемый в challenge \c WWW-Authenticate.
const PIString & realm() const { return auth_realm; }
//! \~english Returns whether a token validator is set.
//! \~russian Возвращает, установлен ли валидатор токена.
bool hasBearerAuthCallback() const { return static_cast(callback_auth); }
protected:
//! \~english Parses the Bearer-scheme \c Authorization header and resolves the user with the
//! token validator set by \a setBearerAuthCallback().
//! \~russian Разбирает заголовок \c Authorization со схемой Bearer и разрешает пользователя
//! валидатором токена, установленным \a setBearerAuthCallback().
PIHTTP::AuthInfo authenticate(const PIHTTP::MessageConst & request) override;
//! \~english Reply produced when \a authenticate() denies access:
//! \c 401 Unauthorized with a \c WWW-Authenticate header advertising the Bearer scheme.
//! \~russian Ответ, создаваемый при отказе \a authenticate():
//! \c 401 Unauthorized с заголовком \c WWW-Authenticate, объявляющим схему Bearer.
PIHTTP::MessageMutable accessDeniedReply(const PIHTTP::MessageConst & request) override;
private:
std::function callback_auth;
PIString auth_realm;
};
#endif