我想知道是否可以在两个请求之间保持PHP会话活动...
我使用Flurl plugin执行请求:
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都会返回没有任何会话在运行。
正如你在这里看到的那样:
我一直在阅读并且所有的答案都是这样说的,我必须使用cookies,cookie来做什么?存储服务器应保留的秘密?我需要知道如何使用相同的会话执行两个请求,或者至少如果这是可能的,因为我不想使用MySQL(使用ID系统,即),我更喜欢保持简单。
答案 0 :(得分:1)
HTTP是一种无状态协议,“保持会话处于活动状态”的唯一方法是在查询字符串中提供会话标识符,或者包含作为第一个身份验证请求的一部分返回的cookie。
这是用户从Web浏览器访问Web应用程序的典型范例,甚至是cURL。
大多数API,可以追溯到现在的SOAP时代,以不同的方式设置。他们让您对每个请求进行身份验证。从服务器端代码或Xhr客户端使用它们的方式更加实用。
例如,使用JWT tokens进行身份验证是目前常见的做法。您可以将带有签名令牌的URI公开给最终用户,并且没有潜在的重播攻击,不必担心。
我认为应该阅读这篇优秀的文章而不是我试图解释你:http://shiflett.org/articles/the-truth-about-sessions
在sessions
和cookies
中,PHP中有很多内容正在进行中 - 值得查看手册中与这两个相关的INI设置的部分。
好的,所以API是正确的PHP代码......?
session_start()创建会话或恢复当前会话 通过GET或POST请求传递的会话标识符,或通过 cookie中。
良好的第一步可能是通过您的网络浏览器向API发出请求,然后查看响应,您是否看到服务器发送了Cookie?
在对API的后续请求中,您是否看到正在使用这些cookie - 我们假设您没有要求您重新进行身份验证?这是它的要点。同样,根据API的性质,基于cookie的会话可能不是最好的方法。
因此,看起来对您使用的HTTP包装器添加了对Cookie的支持... https://github.com/tmenier/Flurl/issues/14
可能是一种更原生的方法? Struggling trying to get cookie out of response with HttpClient in .net 4.5