Как верно настроить сессии авторизации?

S
На сайте с 13.11.2012
Offline
72
4383

Прикрутил к действующей cms - вторую (домен один, вторая cms во внутреннем каталоге).

Объединил логин, пароль (mysql)...

При авторизации в одной cms не авторизует во второй, приходится и там и там проходить авторизацию. Все остальное работает как часы.

Вроде бы нашел где править, но как не пойму, подтолкните к верному решению.

В cms, что я добавил (вторая) есть файл следующего содержания:

<?php

/**
* Этот файл ment, чтобы разрешить скрипт, который будет использоваться с
* существующие системы аутентификации вместо использования собственных
* Изменения могут быть внесены в функцию check_login() для проверки ваших сессий
* Если пользователь вошел в систему возвращают true, а если не перенаправить их на вашей странице входа.
* Вносить изменения только здесь, если Вы не хотите использовать встроенную проверку подлинности системы
*
*/
session_start();
function check_login() {
if($_SESSION['feedback_logged_in'] == true) {
return true;
} else {
$cookie_name = 'intelligentFeedback';
if(isset($_COOKIE[$cookie_name])) {

parse_str($_COOKIE[$cookie_name]);
$db = MySQLDatabase::GetInstance();;
$input = new Input();

$where = array('email' => $inputs->clean($usr), 'password' => $inputs->clean($hash));

$user = $db->Query('feedback_users', '*', $where);

if($user) {
$_SESSION['feedback_logged_in'] = true;
$_SESSION['feedback_user_id'] = $user[0]['id'];
$_SESSION['feedback_user_email'] = $user[0]['email'];

return true;
}

}
header('Location: ../public/auth.php');
exit();
}
}

примерно тот же файл (как я считаю отвечающий за авторизацию) я нашел в главной cms, содержание следующее:

<?php

if (!empty($_COOKIE['sk_u_i']) && !empty($_COOKIE['sk_u_p'])) {
$u_i = SK_secureEncode($_COOKIE['sk_u_i']);
$u_p = SK_secureEncode($_COOKIE['sk_u_p']);

$_SESSION['user_id'] = $u_i;
$_SESSION['user_pass'] = $u_p;
}

if ($logged == true) {
header('Location: ' . SK_smoothLink('index.php?tab1=home'));
}

/* Core */
require_once("assets/includes/core.php");

/* Facebook Developer API */
require_once("assets/imports/facebook/facebook.php");

$fb_config = array(
'appId' => $fb_app_id,
'secret' => $fb_app_secret,
'fileUpload' => false,
'allowSignedRequest' => false,
);

$facebook = new Facebook($fb_config);
$params = array(
'scope' => 'email',
'redirect_uri' => $config['site_url'] . '/import.php?type=facebook'
);

$fb_login_url = $facebook->getLoginUrl($params);

$sk['fb_login_url'] = $fb_login_url;

$sk['content'] = SK_getPage('welcome/content');

какие правки внести в первый файл?

На верном ли я пути?

Спасибо!

totamon
На сайте с 12.05.2007
Offline
437
#1

такое ощущение что разные системы авторизации в этих скриптах, хотя есть схожие места))

чтобы юзер автоматом авторизовался на поддомене нужно выполнить условия:

1. в обоих системах имя cookie авторизации должно быть одинаковым,

а у вас в первом скрипте имя cookie - intelligentFeedback, во втором проверяется 2 cookie отдельно имя юзера и отдельно пароль, что выглядит просто ужасно...

2.в cookie при записе указывается имя домена, по умолчанию вписывается текущий домен, нужно чтобы он был указан причем в форме ".sitename.ru" (с точкой в перед именем домена), тогда такой cookie будет действительным как для домена, так и для всех поддоменов.

Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget
S
На сайте с 13.11.2012
Offline
72
#2

totamon, да системы авторизации совершенно разные, я прикрутил вторую cms которая берет данные из mysql базы первой (имя, логин, пароль...)

Вторую cms расположил не на поддомене а во внутренней папке сайта.

у вас в первом скрипте имя cookie - intelligentFeedback, во втором проверяется 2 cookie отдельно имя юзера и отдельно пароль

подскажите, пожалуйста, какие правки внести в первый скрипт, чтобы было как во втором?

Спасибо!

Сделал так

<?php

session_start();
function check_login() {

if (!empty($_COOKIE['sk_u_i']) && !empty($_COOKIE['sk_u_p'])) {
$u_i = SK_secureEncode($_COOKIE['sk_u_i']);
$u_p = SK_secureEncode($_COOKIE['sk_u_p']);

if(isset($_COOKIE[$cookie_name])) {

parse_str($_COOKIE[$cookie_name]);
$db = MySQLDatabase::GetInstance();;
$input = new Input();

$where = array('email' => $inputs->clean($usr), 'password' => $inputs->clean($hash));

$user = $db->Query('feedback_accounts', '*', $where);

if($user) {

$_SESSION['user_id'] = $u_i;
$_SESSION['user_pass'] = $u_p;

return true;
}

}
header('Location: ../public/auth.php');
exit();
}
}

не работает :(

totamon
На сайте с 12.05.2007
Offline
437
#3

так конкретно я не могу ответить что сделать) маловато кода чтобы разобраться,

я прикрутил вторую cms которая берет данные из mysql базы первой (имя, логин, пароль...)

вы проверили, она точно берет данные? и это для авторизации не главное... важно чтобы вторая система могла понять что это за юзер и действительно он авторизован? те вам нужно не обращаться к базе данных, а работать с cookie..

первая система выставила cookie, вторая прочитала, и отметила у себя что это пользователь и он авторизован. условия я выше написал. в приведенном коде нет куска который именно выставляет cookie, и еще нужно учесть что первая система шифрует информацию о юзере и что бы ее получить нужно использовать функцию из нее

$u_i = SK_secureEncode($_COOKIE***91;'sk_u_i'***93;);
S
На сайте с 13.11.2012
Offline
72
#4

Да, проверил, данные берет.

нет куска который именно выставляет cookie, и еще нужно учесть что первая система шифрует информацию о юзере и что бы ее получить нужно использовать функцию из нее

этот код где искать, в core.php или в function.php?

---------- Добавлено 02.12.2014 в 02:04 ----------

connect.php

<?php
date_default_timezone_set('Asia/Dhaka');
session_cache_limiter('none');
session_start();

// Include 'config.php' file
require('assets/includes/config.php');

// Connect to SQL Server
$dbConnect = mysqli_connect($sql_host, $sql_user, $sql_pass, $sql_name);

// Check connection
if (mysqli_connect_errno($dbConnect)) {
exit(mysqli_connect_error());
}

// Assign database table names to constants
require('tables.php');

// Fetch site configurations
require('assets/settings/general.php');
require('assets/settings/theme.php');
require('assets/settings/ads.php');
$config['site_url'] = $site_url;
$config['theme_url'] = $site_url . '/themes/' . $config['theme'];
$config['script_path'] = str_replace('index.php', '', $_SERVER['PHP_SELF']);
$config['ajax_path'] = $config['script_path'] . 'request.php';
$config['page_path'] = $config['script_path'] . 'page.php';


if (!isset($_SESSION['language'])) {
$_SESSION['language'] = $config['language'];
}

include_once('themes/' . $config['theme'] . '/emoticons/process.php');

// Stores site configurations to variables for later use
$sk = array();
$sk['config'] = $config;

// Login verification and user stats update
$logged = false;
$user = null;

if (SK_isLogged()) {
$user = SK_getUser($_SESSION['user_id'], true);

if (!empty($user['id']) && $user['type'] == "user") {
$sk['user'] = $user;
$logged = true;

$query_two = "UPDATE " . DB_ACCOUNTS . " SET last_logged=" . time() . " WHERE id=" . $user['id'];
$sql_query_two = mysqli_query($dbConnect, $query_two);

if (!empty($user['language'])) {
$_SESSION['language'] = $user['language'];
}

if (!SK_isFollowing($user['id'], $user['id'])) {
$query_three = "DELETE FROM " . DB_FOLLOWERS . " WHERE follower_id=" . $user['id'] . " AND following_id=" . $user['id'];
$sql_query_three = mysqli_query($dbConnect, $query_three);

$query_four = "INSERT INTO " . DB_FOLLOWERS . " (active,follower_id,following_id,time) VALUES (1," . $user['id'] . "," . $user['id'] . "," . time() . ")";
$sql_query_four = mysqli_query($dbConnect, $query_four);
}
}
}

$sk['logged'] = $logged;

// Fetch preferred language
if (!empty($_GET['lang'])) {

if (file_exists('assets/languages/' . $_GET['lang'] . '.php')) {
$config['language'] = $_GET['lang'];
$_SESSION['language'] = $_GET['lang'];

if ($logged == true) {
mysqli_query($dbConnect, "UPDATE " . DB_ACCOUNTS . " SET language='" . $_GET['lang'] . "' WHERE id=" . $user['id']);
}
}
}

require_once('assets/languages/' . $_SESSION['language'] . '.php');

// Removes session and unnecessary variables if user verification fails
if ($logged == false) {
unset($_SESSION['user_id']);
unset($user);
}



---------- Добавлено 02.12.2014 в 02:08 ----------

Нашел код, вроде он шифрует, гляньте пожалуйста.

require_once('assets/includes/core.php');

$t = '';
$a = '';

if (isset($_GET['t'])) {
$t = SK_secureEncode($_GET['t']);
}

if (isset($_GET['a'])) {
$a = SK_secureEncode($_GET['a']);
}

$data = array(
'status' => 417
);

// Login & Verify User
if ($t == "login") {
$data['error_message'] = $lang['error_empty_login'];

if (!empty($_POST['login_id']) && !empty($_POST['login_password'])) {

$login_id = SK_secureEncode($_POST['login_id']);
$login_password = trim($_POST['login_password']);
$login_password_md5 = md5($login_password);

if (preg_match('/@/', $login_id)) {
$db_query_part = "email='$login_id'";
} elseif (preg_match('/^[0-9]+$/', $login_id)) {
$db_query_part = "id=$login_id";
} else {
$db_query_part = "username='$login_id'";
}

$query_one = "SELECT id FROM " . DB_ACCOUNTS . " WHERE $db_query_part AND password='$login_password_md5' AND type='user' AND active=1";
$sql_query_one = mysqli_query($dbConnect, $query_one);
$data['error_message'] = $lang['error_bad_login'];

if (($sql_numrows_one = mysqli_num_rows($sql_query_one)) == 1) {
$sql_fetch_one = mysqli_fetch_assoc($sql_query_one);

$query_two = "SELECT username,email_verified FROM " . DB_ACCOUNTS . " WHERE id=" . $sql_fetch_one['id'] . " AND password='$login_password_md5' AND type='user' AND active=1";
$sql_query_two = mysqli_query($dbConnect, $query_two);

if (($sql_numrows_two = mysqli_num_rows($sql_query_two)) == 1) {
$sql_fetch_two = mysqli_fetch_assoc($sql_query_two);
$continue = true;

if ($config['email_verification'] == 1 && $sql_fetch_two['email_verified'] == 0) {
$continue = false;
$data['error_message'] = $lang['error_verify_email'];
}

if ($continue == true) {
$_SESSION['user_id'] = $sql_fetch_one['id'];
$_SESSION['user_pass'] = $login_password_md5;

if (!empty($_POST['keep_logged_in']) && $_POST['keep_logged_in'] == 1) {
setcookie('sk_u_i', $_SESSION['user_id'], time() + (60 * 60 * 24 * 7));
setcookie('sk_u_p', $_SESSION['user_pass'], time() + (60 * 60 * 24 * 7));
}

$data['status'] = 200;
$data['redirect_url'] = SK_smoothLink('index.php?tab1=home');
}
}
}
}

header("Content-type: application/json");
echo json_encode($data);
mysqli_close($dbConnect);
exit();
}

// Register User
if ($t == "register") {
$proceed = false;
$data['error_message'] = $lang['error_bad_captcha'];

if ($config['captcha'] == false) {
$proceed = true;
} elseif (!empty($_POST['captcha']) && $_POST['captcha'] == $_SESSION['captcha_key']) {
$proceed = true;
}

if ($proceed == true) {
$data['error_message'] = $lang['error_empty_registration'];

if (($register = SK_registerUser($_POST)) != false) {
$register['verification_link'] = $config['site_url'] . '/?tab1=email-verification&email=' . $register['email'] . '&key=' . $register['email_verification_key'];
$sk['mail'] = $register;

$to = $register['email'];
$subject = $config['site_name'] . ' - Email Verification';

$headers = "From: " . $config['email'] . "\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

$message = SK_getPage('emails/email-verification');
mail($to, $subject, $message, $headers);

if ($config['email_verification'] == 0) {
$_SESSION['user_id'] = $register['id'];
$_SESSION['user_pass'] = md5(trim($_POST['password']));

$data['status'] = 200;
$data['redirect_url'] = SK_smoothLink('index.php?tab1=home');
} else {
$data['error_message'] = $lang['verification_email_sent'];
}
}
}

header("Content-type: application/json");
echo json_encode($data);
mysqli_close($dbConnect);
exit();
}



---------- Добавлено 02.12.2014 в 02:46 ----------

Сделал так и не помогло

<?php
/**
* This file is ment to allow the script to be used with an
* existing authentication system instead of using its own
* Changes can be made to the function check_login() to check for your sessions
* If the user is logged in return true and if not redirect them to your login page.
* Only make changes here if you do not want to use the bundled authentication system
*
* @package Simple Advert
* @author robertnduati
*/


session_start();

function check_login() {
if ($continue == true) {
$_SESSION['user_id'] = $sql_fetch_one['id'];
$_SESSION['user_pass'] = $login_password_md5;

if (!empty($_POST['keep_logged_in']) && $_POST['keep_logged_in'] == 1) {
setcookie('sk_u_i', $_SESSION['user_id'], time() + (60 * 60 * 24 * 7));
setcookie('sk_u_p', $_SESSION['user_pass'], time() + (60 * 60 * 24 * 7));
}
$data['status'] = 200;
$data['redirect_url'] = SK_smoothLink('index.php?tab1=home');

$db = MySQLDatabase::GetInstance();;
$input = new Input();

$where = array('email' => $inputs->clean($usr), 'password' => $inputs->clean($hash));

$user = $db->Query('accounts', '*', $where);

if($user) {
$_SESSION['logged_in'] = true;
$_SESSION['user_id'] = $user[0]['id'];
$_SESSION['user_email'] = $user[0]['email'];

return true;
}

}

header('Location: ../welcome');
exit();
}

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий