mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
add Json for getting app access token with valid session_id
This commit is contained in:
parent
5323052300
commit
d35c4682c2
36
src/cpp/JSONInterface/JsonAquireAccessToken.cpp
Normal file
36
src/cpp/JSONInterface/JsonAquireAccessToken.cpp
Normal file
@ -0,0 +1,36 @@
|
||||
#include "JsonAquireAccessToken.h"
|
||||
#include "Poco/URI.h"
|
||||
|
||||
#include "../SingletonManager/SessionManager.h"
|
||||
#include "../SingletonManager/ErrorManager.h"
|
||||
|
||||
#include "../controller/AppAccessToken.h"
|
||||
|
||||
#include "../lib/DataTypeConverter.h"
|
||||
|
||||
Poco::JSON::Object* JsonAquireAccessToken::handle(Poco::Dynamic::Var params)
|
||||
{
|
||||
auto session_result = checkAndLoadSession(params);
|
||||
if (session_result) {
|
||||
return session_result;
|
||||
}
|
||||
Poco::JSON::Object* result = new Poco::JSON::Object;
|
||||
result->set("state", "success");
|
||||
auto user = mSession->getNewUser();
|
||||
auto user_id = user->getModel()->getID();
|
||||
auto access_tokens = controller::AppAccessToken::load(user_id);
|
||||
Poco::AutoPtr<controller::AppAccessToken> access_token;
|
||||
if (access_tokens.size() > 0) {
|
||||
access_token = access_tokens[0];
|
||||
access_token->getModel()->update();
|
||||
}
|
||||
else {
|
||||
access_token = controller::AppAccessToken::create(user_id);
|
||||
access_token->getModel()->insertIntoDB(false);
|
||||
}
|
||||
|
||||
result->set("access_token", std::to_string(access_token->getModel()->getCode()));
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
16
src/cpp/JSONInterface/JsonAquireAccessToken.h
Normal file
16
src/cpp/JSONInterface/JsonAquireAccessToken.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef __JSON_INTERFACE_JSON_ACQUIRE_ACCESS_TOKEN_
|
||||
#define __JSON_INTERFACE_JSON_ACQUIRE_ACCESS_TOKEN_
|
||||
|
||||
#include "JsonRequestHandler.h"
|
||||
|
||||
class JsonAquireAccessToken : public JsonRequestHandler
|
||||
{
|
||||
public:
|
||||
Poco::JSON::Object* handle(Poco::Dynamic::Var params);
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // __JSON_INTERFACE_JSON_ACQUIRE_ACCESS_TOKEN_
|
||||
@ -13,6 +13,14 @@
|
||||
#include "../lib/DataTypeConverter.h"
|
||||
#include "../SingletonManager/SessionManager.h"
|
||||
|
||||
#include "../SingletonManager/SessionManager.h"
|
||||
|
||||
JsonRequestHandler::JsonRequestHandler()
|
||||
: mSession(nullptr)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void JsonRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response)
|
||||
{
|
||||
|
||||
@ -29,6 +37,8 @@ void JsonRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Po
|
||||
//Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1);
|
||||
//std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream;
|
||||
|
||||
mClientIp = request.clientAddress().host();
|
||||
|
||||
auto method = request.getMethod();
|
||||
std::istream& request_stream = request.stream();
|
||||
Poco::JSON::Object* json_result = nullptr;
|
||||
@ -136,3 +146,56 @@ Poco::JSON::Object* JsonRequestHandler::customStateError(const char* state, cons
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Poco::JSON::Object* JsonRequestHandler::checkAndLoadSession(Poco::Dynamic::Var params)
|
||||
{
|
||||
int session_id = 0;
|
||||
auto sm = SessionManager::getInstance();
|
||||
|
||||
if (params.isStruct()) {
|
||||
session_id = params["session_id"];
|
||||
//std::string miau = params["miau"];
|
||||
}
|
||||
else if (params.isVector()) {
|
||||
try {
|
||||
const Poco::URI::QueryParameters queryParams = params.extract<Poco::URI::QueryParameters>();
|
||||
for (auto it = queryParams.begin(); it != queryParams.end(); it++) {
|
||||
if (it->first == "session_id") {
|
||||
auto numberParseResult = DataTypeConverter::strToInt(it->second, session_id);
|
||||
if (DataTypeConverter::NUMBER_PARSE_OKAY != numberParseResult) {
|
||||
return stateError("error parsing session_id", DataTypeConverter::numberParseStateToString(numberParseResult));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
//auto var = params[0];
|
||||
}
|
||||
catch (Poco::Exception& ex) {
|
||||
return stateError("error parsing query params, Poco Error", ex.displayText());
|
||||
}
|
||||
}
|
||||
|
||||
if (!session_id) {
|
||||
return stateError("empty session id");
|
||||
}
|
||||
|
||||
auto session = sm->getSession(session_id);
|
||||
if (!session) {
|
||||
return customStateError("not found", "session not found");
|
||||
}
|
||||
if (!session->isIPValid(mClientIp)) {
|
||||
return stateError("client ip differ from login client ip");
|
||||
}
|
||||
auto userNew = session->getNewUser();
|
||||
//auto user = session->getUser();
|
||||
if (userNew.isNull()) {
|
||||
return customStateError("not found", "Session didn't contain user");
|
||||
}
|
||||
auto userModel = userNew->getModel();
|
||||
if (userModel.isNull()) {
|
||||
return customStateError("not found", "User is empty");
|
||||
}
|
||||
mSession = session;
|
||||
return nullptr;
|
||||
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
|
||||
#include "Poco/Net/HTTPRequestHandler.h"
|
||||
#include "Poco/JSON/Object.h"
|
||||
|
||||
#include "../model/Session.h"
|
||||
#include "../lib/NotificationList.h"
|
||||
|
||||
|
||||
@ -11,6 +11,8 @@ class JsonRequestHandler : public Poco::Net::HTTPRequestHandler
|
||||
{
|
||||
public:
|
||||
|
||||
JsonRequestHandler();
|
||||
|
||||
void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response);
|
||||
|
||||
virtual Poco::JSON::Object* handle(Poco::Dynamic::Var params) = 0;
|
||||
@ -19,6 +21,11 @@ public:
|
||||
|
||||
protected:
|
||||
Poco::JSON::Object* mResultJson;
|
||||
Poco::Net::IPAddress mClientIp;
|
||||
Session* mSession;
|
||||
|
||||
Poco::JSON::Object* checkAndLoadSession(Poco::Dynamic::Var params);
|
||||
|
||||
static Poco::JSON::Object* stateError(const char* msg, std::string details = "");
|
||||
static Poco::JSON::Object* customStateError(const char* state, const char* msg, std::string details = "");
|
||||
static Poco::JSON::Object* stateSuccess();
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
#include "../SingletonManager/SessionManager.h"
|
||||
|
||||
#include "JsonAdminEmailVerificationResend.h"
|
||||
#include "JsonAquireAccessToken.h"
|
||||
#include "JsonCreateTransaction.h"
|
||||
#include "JsonCreateUser.h"
|
||||
#include "JsonGetLogin.h"
|
||||
@ -82,5 +83,8 @@ Poco::Net::HTTPRequestHandler* JsonRequestHandlerFactory::createRequestHandler(c
|
||||
else if (url_first_part == "/logout") {
|
||||
return new JsonLogout(client_host);
|
||||
}
|
||||
else if (url_first_part == "/acquireAccessToken") {
|
||||
return new JsonAquireAccessToken;
|
||||
}
|
||||
return new JsonUnknown;
|
||||
}
|
||||
|
||||
@ -59,6 +59,11 @@ namespace model
|
||||
return insert;
|
||||
}
|
||||
|
||||
size_t AppAccessToken::update()
|
||||
{
|
||||
return updateIntoDB("update", Poco::DateTime());
|
||||
}
|
||||
|
||||
|
||||
Poco::Data::Statement AppAccessToken::_loadFromDB(Poco::Data::Session session, const std::string& fieldName)
|
||||
{
|
||||
|
||||
@ -29,6 +29,7 @@ namespace model {
|
||||
inline void setCode(Poco::UInt64 code) { mAccessCode = code; }
|
||||
inline void setUserId(int user_Id) { mUserId = user_Id; }
|
||||
|
||||
size_t update();
|
||||
|
||||
protected:
|
||||
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user