Поддерживайте сессию PHP между двумя запросами, используя C # HttpClient - PullRequest
0 голосов
/ 09 мая 2018

Я хочу знать, возможно ли поддерживать сессии PHP между двумя запросами ...

Я делаю запросы, используя Плагин Flurl :

    public const string ApiUrl = "http://localhost/z/api.php";

    public static string MethodName()
    {
        using (FlurlClient client = new FlurlClient())
        {
            string res = client.HttpGet(string.Format("{0}?action={1}", ApiUrl, "captcha"), true);

            //Some actions...

            return client.HttpPost(ApiUrl, new { action = "resolve-captcha", input = r }, false);
        }
    }

    public static string HttpPost(this FlurlClient client, string url, object data, bool keepalive = false)
    {
        return client.Request(url).PostUrlEncodedAsync(data).ReceiveString().GetAwaiter().GetResult();
    }

    public static string HttpGet(this FlurlClient client, string url, bool keepalive = false)
    {
        return client.Request(url).GetStringAsync().GetAwaiter().GetResult();
    }

А в части PHP (API):

//if isset $_GET then switch action key...
case "captcha":
    if (session_status() == PHP_SESSION_NONE)
        session_start();

    $_SESSION['phrase'] = "hello";
    break;

//if isset $_POST then switch action key...
case "resolve-captcha":
    $secret = @$_SESSION["phrase"];

    if(session_status() == PHP_SESSION_NONE)
        die("No session!");
    else
        $coreData["secret"] = $secret;

    $input = @$_POST["input"];
    $coreData["valid"] = $input === $secret;
    break;

Но по какой-то причине, каждый раз, когда я делаю следующий шаг (Post), API возвращает, что сеанс не запущен.

Как вы можете видеть здесь:

...

Я читаю, и все ответы говорят о том, что я должен использовать куки, куки для чего? Хранить секрет, который должен хранить сервер? Мне нужно знать, как я могу сделать два запроса в одном сеансе или, по крайней мере, если это возможно, потому что я не хочу использовать MySQL (например, с системой ID), я предпочитаю сделать это проще.

1 Ответ

0 голосов
/ 09 мая 2018

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

Это типичная парадигма для пользователя, который обращается к веб-приложению через веб-браузер или даже в cURL.

Большинство API, начиная с дней SOAP и до настоящего времени, настроены по-разному. Они вас аутентифицируют с каждым запросом. Просто более практично с тем, как они используются ... из серверного кода или со стороны клиента Xhr.

Например, аутентификация с использованием токенов JWT является распространенным подходом в наши дни. Вы можете предоставить URI с подписанным токеном конечному пользователю, и вам не придется беспокоиться о возможных атаках воспроизведения.

Я думаю, что вместо того, чтобы пытаться объяснить, вам следует прочитать эту прекрасную статью: http://shiflett.org/articles/the-truth-about-sessions В PHP много чего происходит, когда дело доходит до sessions и cookies - стоит проверить раздел в руководстве, который касается настроек INI, связанных с этими двумя.

ОК, значит API - это правильный PHP-код ...?

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

Хорошим первым шагом может быть отправка запроса в API через веб-браузер, а затем поиск ответа, видите ли вы файлы cookie, отправляемые сервером?

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

Итак, похоже, что поддержка cookie была добавлена ​​в используемую вами оболочку HTTP ... https://github.com/tmenier/Flurl/issues/14

Возможно, более нативный подход? Борьба с попыткой получить cookie из ответа с помощью HttpClient в .net 4.5

...