Переменные PHP $ _SESSION не работают в приложении ionic / angularjs - PullRequest
0 голосов
/ 10 января 2019

Информация об окружении разработчика:

  • Местное развитие
  • Настройка сетевого диска моего сервера на моем ПК
  • Доступ к файлам сервера через путь к каталогу
  • Сервер содержит базы данных SQL, к которым серверные файлы обращаются и

При загрузке приложения

Я установил на своей странице ng-init для запуска функции $scope.nginit();, которая отправляет запрос $ _GET на файл моего сервера с именем login.php:

$http.get(url + "server/login.php", 
            { transformResponse: [] })
.success(function(data, status, headers, config) 
{
    data = JSON.parse(data);
    window.localStorage.setItem("session_id",data.session_id);
})
.error( function(data, status, headers, config) 
{
    console.log("Error: " + data + "; " + status);
});

Это включено в каждый из файлов моего сервера в верхней части страницы:

// if(isset($_GET['session_id'])) {
//  session_id($_GET['session_id']);
// } else if(isset($_POST['session_id'])) {
//  session_id($_POST['session_id']);
// }

session_start();

include_once "../scripts/masterscript.php";

header("Access-Control-Allow-Origin: *");

$connection = connect_to_database();
try
{
    if($_SERVER['REQUEST_METHOD'] != 'POST')
    {
        setup_form();
    }
    else
    {
        process_form();
    }

    sqlsrv_close($connection);  
}
catch (Exception $e)
{
    exit("Exception $e->getMessage()");
}

Вот setup_form () для login.php:

function setup_form()
{
    global $connection;
    header('Content-Type: application/json');
    $user_data = array();

    $user_data["session_id"] = session_id();

    echo json_encode($user_data);   
}

On submitForm (); для входа в систему:

Он добавляет session_id, хранящийся в localStorage, в качестве параметра, чтобы его можно было вернуть к сеансу PHP. Он помещает его поверх файла PHP, но этот раздел в настоящее время закомментирован.

Мое намерение, если это пользователь с правами администратора, запустить второй $ http.request и открыть модальное.

$http.post(url + "pages/login.php", data_string,
            {   headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8;' }, 
                params : { 'session_id' : window.localStorage.session_id }})
.success(function(data, status, headers, config) 
{
    var data = data[0];

    if(data.is_admin)
    {
        $http.get(url + "server/get_more_info.php", 
                    { params : {'user_id' : data.user_id },
                    transformResponse: [] })
        .success(function(data, status, headers, config) 
        {
            // setup to open a modal
        })
        .error( function(data, status, headers, config) 
        {
        }); 
    }
})
.error( function(data, status, headers, config) 
{
});

Поскольку это запрос $ _POST, он переходит к process_form (), и вот он:

function process_form()
{
    global $connection;
    header('Content-Type: application/json');
    $user_data = array();

    $data_string = file_get_contents("php://input");
    $data = json_decode($data_string);

    $user_data['status_msg'] = "Error";

    // runs SQL query, grabs user details where email = $data->email
    $UserObj = new User(0,$connection, $data->email); 

    if($UserObj->password == $data->password)
    {
        $user_data['status_msg'] = "OK";
        $user_data['user_id']    = $UserObj->user_id;
        $user_data['user_type'] = $UserObj->user_type;

        if($UserObj->admin_user == 1)
        {
            $user_data['is_admin'] = true;
            $_SESSION['is_admin'] = 1;
        }

        $_SESSION['user_id'] = $UserObj->user_id;
        $_SESSION['user_type'] = $UserObj->user_type;
    }

    unset($UserObj);
    echo json_encode($user_data);
 }

В get_more_info.php

Я пытаюсь получить доступ к переменным сеанса, установленным в login.php, но они пустые. Я намереваюсь использовать эти переменные в запросах SQL:

$user_id = $_SESSION['user_id'];
$admin_user = $_SESSION['admin_user'];
$user_type = $_SESSION['user_type'];

$sql = " select * from info_table where admin_user = ? and user_type = ?";
$params = array($admin_user,$user_type);
$result = sqlsrv_query($connection, $sql, $params);       

while($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC))
{
}

sqlsrv_free_stmt($result);
unset($result);

Дополнительная информация

Я сделал var_dump (); для обоих из них ниже и возвращаются пустые строки.

ini_get('session.cookie_httponly');
ini_get('session.cookie_secure');

В Firefox появляется первый сетевой запрос для login.php, который является запросом GET и имеет набор $ _COOKIE. Кажется, что он работает в Chrome, но не Firefox. Я сейчас просто бегаю ionic serve --lab. В chrome он запускается и открывает модальный режим, как и должен, а в Firefox - нет.

На вкладке сети Firefox для запроса login.php GET он показывает set-cookie под заголовками ответа, но нет атрибута, связанного с cookie, в заголовках запросов.

Для запроса login.php POST он имеет тот же результат, что и предыдущий для cookie, но этот запрос отображается как метод OPTIONS на вкладке сети вместо POST.

Вопросы

  • Первоначальной проблемой было то, что переменные сеанса были пустыми в get_more_info.php. Это было связано с тем, что он не возобновлялся до того же сеанса, который начался в $scope.nginit();. Вместо этого он начинал новый.
  • Идея получения session_id для сохранения, чтобы он мог возобновить к тому же сеансу, была выдвинута, вот что я здесь сделал.
  • Первоначально я пытался установить session_id, вручную установив его в верхней части моих файлов PHP, но мне было сообщено, что это не нужно, и он должен делать это автоматически, а это не так.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Чтобы использовать куки (которые требуются для php-сессий), вы должны указать своему приложению разрешить его.

Используйте это для глобальной настройки, после чего приложение будет использовать ваш файл cookie и повторно использовать его для других запросов.

.config(['$httpProvider', function($httpProvider) {
   $httpProvider.defaults.withCredentials = true;
}])
0 голосов
/ 14 января 2019

Backend

Первый: этот бит не нужен :

if(isset($_GET['session_id'])) {
    session_id($_GET['session_id']);
} else if(isset($_POST['session_id'])) {
    session_id($_POST['session_id']);
}

Единственная строка, которая вам нужна в начале вашего more_details.php файла - это session_start().

Если вы посмотрите на документацию для этой функции , она ясно говорит:

session_start () создает сеанс или возобновляет (*) текущий сеанс на основе идентификатора сеанса, переданного через запрос GET или POST, или переданного через cookie.

* упорная мина

Таким образом, после того как вы позвоните, вы можете безопасно получить доступ к $_SESSION свойствам.

Во-вторых, вам нужно настроить правильные заголовки CORS.

header("Access-Control-Allow-Origin: http://localhost:8000");
header("Access-Control-Allow-Headers: content-type, authorization");
header("Access-Control-Allow-Credentials: true");

Очень важно : Access-Control-Allow-Origin нельзя установить на *, иначе это не удастся. При использовании credentials разрешенный источник должен быть установлен явно.

Кроме того, вам необходимо учитывать вызов OPTIONS, который должен возвращать те же самые заголовки. Этот вызов будет выполнен браузером как проверка перед полетом перед запросом POST.

Для целей этого ответа у меня есть файл common.php, который выглядит так:

<?php
session_start();
header( "Access-Control-Allow-Origin: http://localhost:8000" );
header( 'Content-Type: application/json' );
header( "Access-Control-Allow-Headers: content-type,authorization" );
header( "Access-Control-Allow-Credentials: true" );

if ( $_SERVER['REQUEST_METHOD'] == 'OPTIONS' ) {
    die();
}

Другой файл one.php :

<?php
// one.php
<?php
require 'common.php';

$was_session_set     = $_SESSION['user_id'] ?? 'no session id yet';
$_SESSION['user_id'] = microtime( true );

echo '{"session": "' . $was_session_set . '"}';

die();

Другой two.php :

<?php
require 'common.php';

$user_id = $_SESSION['user_id'] ?? 0;
echo '{"session": "' . $user_id  .'"}';

die();

Frontend

let app = angular.module('myApp', []);
app.controller('myCtrl', function ($scope, $http) {
$http.get("http://localhost:8006/one.php",  { withCredentials: true })
    .then(function (response) {
      $scope.myWelcome = response.data;
      $http.post("http://localhost:8006/two.php", { withCredentials: true })
          .then(function (response2) {
            console.log(response2.data);
          })
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...