Теперь можно делать так: curl -d 'login=manager&password=1' -X POST http://10.1.1.1:8090/sites/demo/admin/?action=api_key
С полученным ключом будут доступны команды, прописанные в json-ке как доступные с ключом
This commit is contained in:
parent
fa4adbb75f
commit
6a9ef3534b
2 changed files with 92 additions and 28 deletions
|
|
@ -14,24 +14,11 @@ class Filter_Login extends Filter_Filter
|
||||||
const SESSION_BROWSER_SIGN_KEYNAME = 'session.app.browser.sign';
|
const SESSION_BROWSER_SIGN_KEYNAME = 'session.app.browser.sign';
|
||||||
public $mode = 'ajax';
|
public $mode = 'ajax';
|
||||||
public $user;
|
public $user;
|
||||||
|
/*
|
||||||
/**
|
* Проверка пары логин/пароль
|
||||||
* Проверка авторизации
|
|
||||||
* @return Boolean Авторизовани пользователь или нет
|
|
||||||
*/
|
*/
|
||||||
public function isLoggin(HttpRequest $request)
|
public function checkLoginPasswordPair($db, $login, $password)
|
||||||
{
|
{
|
||||||
// Авторизация
|
|
||||||
session_start();
|
|
||||||
$db = $this->getConnection();
|
|
||||||
Filter_UserAccess::setUp($db); // Соединение
|
|
||||||
|
|
||||||
switch ($request->getAction()) {
|
|
||||||
// Авторизация по постоянному паролю
|
|
||||||
case 'login':
|
|
||||||
$login = $request->get('login');
|
|
||||||
$password = $request->get('password');
|
|
||||||
|
|
||||||
$result = Filter_UserAccess::getUserByLogin($login); // Поиск по логину
|
$result = Filter_UserAccess::getUserByLogin($login); // Поиск по логину
|
||||||
if ($result) {
|
if ($result) {
|
||||||
$userPassword = $result->getString('password');
|
$userPassword = $result->getString('password');
|
||||||
|
|
@ -50,12 +37,34 @@ class Filter_Login extends Filter_Filter
|
||||||
return false;
|
return false;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
// Извлечнеие пользователя из родительской CMS, для проверки пароля
|
// Извлечение пользователя из родительской CMS, для проверки пароля
|
||||||
if (md5($password) == $userPassword) { // password
|
if (md5($password) == $userPassword) { // password
|
||||||
$this->enter($db, $result);
|
$this->enter($db, $result);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Проверка авторизации
|
||||||
|
* @return Boolean Авторизован пользователь или нет
|
||||||
|
*/
|
||||||
|
public function isLoggin(HttpRequest $request)
|
||||||
|
{
|
||||||
|
// Авторизация
|
||||||
|
session_start();
|
||||||
|
$db = $this->getConnection();
|
||||||
|
Filter_UserAccess::setUp($db); // Соединение
|
||||||
|
|
||||||
|
switch ($request->getAction()) {
|
||||||
|
// Авторизация по постоянному паролю
|
||||||
|
case 'api_key':
|
||||||
|
case 'login':
|
||||||
|
$login = $request->get('login');
|
||||||
|
$password = $request->get('password');
|
||||||
|
if($this->checkLoginPasswordPair($db,$login,$password)==true){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
$request->set('error', true);
|
$request->set('error', true);
|
||||||
break;
|
break;
|
||||||
case 'logout': // Выход
|
case 'logout': // Выход
|
||||||
|
|
@ -122,6 +131,7 @@ class Filter_Login extends Filter_Filter
|
||||||
public function execute(HttpRequest $request)
|
public function execute(HttpRequest $request)
|
||||||
{
|
{
|
||||||
$logged = $this->isLoggin($request);
|
$logged = $this->isLoggin($request);
|
||||||
|
// return json_encode(["logged"=>$logged]);
|
||||||
if ($request->get('action') == 'user_access') {
|
if ($request->get('action') == 'user_access') {
|
||||||
if ($logged) {
|
if ($logged) {
|
||||||
$result = array();
|
$result = array();
|
||||||
|
|
@ -135,6 +145,11 @@ class Filter_Login extends Filter_Filter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($logged && ($request->get('action') == 'api_key')) {
|
||||||
|
$result['key'] = Security::generateAPIKey(strval(time()));
|
||||||
|
return json_encode($result);
|
||||||
|
}
|
||||||
|
|
||||||
if ($request->get('action') == 'relogin') {
|
if ($request->get('action') == 'relogin') {
|
||||||
if ($logged) {
|
if ($logged) {
|
||||||
return json_encode(array('result' => 'ok', 'message' => "Авторизация успешна"));
|
return json_encode(array('result' => 'ok', 'message' => "Авторизация успешна"));
|
||||||
|
|
@ -147,7 +162,7 @@ class Filter_Login extends Filter_Filter
|
||||||
// Параметры при неправильной авторизации
|
// Параметры при неправильной авторизации
|
||||||
// Действия по умолчанию !! Возможно переход на форму регистрации
|
// Действия по умолчанию !! Возможно переход на форму регистрации
|
||||||
if ($request->get('mode') == 'ajax') {
|
if ($request->get('mode') == 'ajax') {
|
||||||
if (!$this->requestIsWhite($request)) {
|
if ((!$this->requestIsWhite($request))&&(!$this->APIKeyCheck($request))) {
|
||||||
return json_encode(array('result' => 'fail', 'message' =>"NOT_AUTHORIZED"));
|
return json_encode(array('result' => 'fail', 'message' =>"NOT_AUTHORIZED"));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -186,4 +201,49 @@ class Filter_Login extends Filter_Filter
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ---------------------
|
||||||
|
* Проверка на попадание реквеста в API_key_allowed и проверка ключа API
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function APIKeyCheck(Collection $request) {
|
||||||
|
$key = $request->get('api_key');
|
||||||
|
if(!is_string($key)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$module = $request->get('module');
|
||||||
|
$action = $request->get('action');
|
||||||
|
|
||||||
|
$moduleDir = explode('_',$module)[0];
|
||||||
|
$file = Path::join(CMS_PATH, 'modules', $moduleDir, 'filters', 'api_key.json');
|
||||||
|
if (file_exists($file)) {
|
||||||
|
$whiteList = json_decode(file_get_contents($file), true);
|
||||||
|
|
||||||
|
if (in_array($action, $whiteList)) {
|
||||||
|
if($this->isValidAPIKey($key)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* ключ API имеет вид [unixTime]_[hash(unixTime,WWW_PATH)]
|
||||||
|
*/
|
||||||
|
public function isValidAPIKey(String $key) {
|
||||||
|
$parts = explode('_',$key,2);
|
||||||
|
if(count($parts)!=2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$timestamp = intval($parts[0]);
|
||||||
|
$timediff = time()-$timestamp;
|
||||||
|
if(($timediff<0)||($timediff>60*60*24)) { // key is valid for 24 hours
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if($key != Security::generateAPIKey($timestamp)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,4 +30,8 @@ class Security {
|
||||||
}
|
}
|
||||||
return $password;
|
return $password;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function generateAPIKey($timestamp){
|
||||||
|
return $timestamp."_".md5(WWW_PATH.$timestamp."asjfgkg0o123rkdsdfl1023kwaf012kj10asdld");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue