Теперь можно делать так: 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,10 +14,40 @@ class Filter_Login extends Filter_Filter
|
|||
const SESSION_BROWSER_SIGN_KEYNAME = 'session.app.browser.sign';
|
||||
public $mode = 'ajax';
|
||||
public $user;
|
||||
/*
|
||||
* Проверка пары логин/пароль
|
||||
*/
|
||||
public function checkLoginPasswordPair($db, $login, $password)
|
||||
{
|
||||
$result = Filter_UserAccess::getUserByLogin($login); // Поиск по логину
|
||||
if ($result) {
|
||||
$userPassword = $result->getString('password');
|
||||
if (Filter_UserAccess::$access == 'site_root' && defined('PARENT_PATH')) {
|
||||
$s = new Settings(PARENT_PATH . '/settings.json');
|
||||
$s->read();
|
||||
$dsn = $s->readKey(array('system', 'dsn'));
|
||||
|
||||
$db = Database::getConnection($dsn);
|
||||
$user = $db->fetchOneArray("SELECT * FROM users WHERE login = :login", ['login' => $login]);
|
||||
$userPassword = $user['password'];
|
||||
} /*else if (time() - $result->getInt('lastupdate') > 60*60*24*60) {
|
||||
// Проверить давность пароля, 60 дней
|
||||
$request->set('error', true);
|
||||
$request->set('lastupdate', true);
|
||||
return false;
|
||||
}*/
|
||||
|
||||
// Извлечение пользователя из родительской CMS, для проверки пароля
|
||||
if (md5($password) == $userPassword) { // password
|
||||
$this->enter($db, $result);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Проверка авторизации
|
||||
* @return Boolean Авторизовани пользователь или нет
|
||||
* @return Boolean Авторизован пользователь или нет
|
||||
*/
|
||||
public function isLoggin(HttpRequest $request)
|
||||
{
|
||||
|
|
@ -28,33 +58,12 @@ class Filter_Login extends Filter_Filter
|
|||
|
||||
switch ($request->getAction()) {
|
||||
// Авторизация по постоянному паролю
|
||||
case 'api_key':
|
||||
case 'login':
|
||||
$login = $request->get('login');
|
||||
$password = $request->get('password');
|
||||
|
||||
$result = Filter_UserAccess::getUserByLogin($login); // Поиск по логину
|
||||
if ($result) {
|
||||
$userPassword = $result->getString('password');
|
||||
if (Filter_UserAccess::$access == 'site_root' && defined('PARENT_PATH')) {
|
||||
$s = new Settings(PARENT_PATH . '/settings.json');
|
||||
$s->read();
|
||||
$dsn = $s->readKey(array('system', 'dsn'));
|
||||
|
||||
$db = Database::getConnection($dsn);
|
||||
$user = $db->fetchOneArray("SELECT * FROM users WHERE login = :login", ['login' => $login]);
|
||||
$userPassword = $user['password'];
|
||||
} /*else if (time() - $result->getInt('lastupdate') > 60*60*24*60) {
|
||||
// Проверить давность пароля, 60 дней
|
||||
$request->set('error', true);
|
||||
$request->set('lastupdate', true);
|
||||
return false;
|
||||
}*/
|
||||
|
||||
// Извлечнеие пользователя из родительской CMS, для проверки пароля
|
||||
if (md5($password) == $userPassword) { // password
|
||||
$this->enter($db, $result);
|
||||
return true;
|
||||
}
|
||||
if($this->checkLoginPasswordPair($db,$login,$password)==true){
|
||||
return true;
|
||||
}
|
||||
$request->set('error', true);
|
||||
break;
|
||||
|
|
@ -121,7 +130,8 @@ class Filter_Login extends Filter_Filter
|
|||
|
||||
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 ($logged) {
|
||||
$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 ($logged) {
|
||||
return json_encode(array('result' => 'ok', 'message' => "Авторизация успешна"));
|
||||
|
|
@ -147,7 +162,7 @@ class Filter_Login extends Filter_Filter
|
|||
// Параметры при неправильной авторизации
|
||||
// Действия по умолчанию !! Возможно переход на форму регистрации
|
||||
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"));
|
||||
}
|
||||
} else {
|
||||
|
|
@ -186,4 +201,49 @@ class Filter_Login extends Filter_Filter
|
|||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ class Security {
|
|||
if ($strength & 8) {
|
||||
$consonants .= '@#$%';
|
||||
}
|
||||
|
||||
|
||||
$password = '';
|
||||
$alt = time() % 2;
|
||||
for ($i = 0; $i < $length; $i++) {
|
||||
|
|
@ -30,4 +30,8 @@ class Security {
|
|||
}
|
||||
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