【问题标题】:How to create session with php curl in mediawiki api如何在 mediawiki api 中使用 php curl 创建会话
【发布时间】:2015-08-17 06:32:55
【问题描述】:

我正在研究 mediawiki api,我想使用 api 创建用户登录。我提到了这个link。但我无法创建会话。

这是我的代码

第一步

我已经用这个创建了一个会话 id

session_start();
    $data = "action=login&lgname=Wiki&lgpassword=gjnlt&lgtoken=5ae555656110dd20a2b0504e4d7e35e0";  // login
    $result=call($data);   // get the session id
    function call($data=null)
    {
        $ch = curl_init('http://192.168.1.32/Eb_new/mediawiki/api.php?format=json');
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Accept: application/json',
            'Content-Length: ' . strlen($data))
        );

        $result = curl_exec($ch);
        return $result=json_decode($result);
    }

我得到的回应是。

{"login":{"result":"Success","lguserid":5,"lgusername":"Wiki","lgtoken":"d85fd0201276632858ce4ad3ac351de4","cookieprefix":"EB_new_wiki_","sessionid":"3b8cdab43d4cda6b4548a3cc27604e20"}} 

第二步

现在我在$result->login->sessionid 中有一个会话 ID。为了设置会话,我再次调用设置会话,像这样

setsession($result->login->sessionid);   // set the session

function setsession($sessionid)
{
        $field_array= array(
      'Accept' => 'HTTP_ACCEPT',
      'Accept-Charset' => 'HTTP_ACCEPT_CHARSET',
      'Accept-Encoding' => 'HTTP_ACCEPT_ENCODING',
      'Accept-Language' => 'HTTP_ACCEPT_LANGUAGE',
      'Connection' => 'HTTP_CONNECTION',
      'Host' => 'HTTP_HOST',
      'Referer' => 'HTTP_REFERER',
      'User-Agent' => 'HTTP_USER_AGENT',
      'Set-Cookie'=>'enwikiSession='.$sessionid.' ;domain=http://192.168.1.32/Eb_new/mediawiki'
      );

    $curl_request_headers=array();

    foreach ($field_array as $key => $value) {
       if(isset($_SERVER["$value"])) {
          $server_value=$_SERVER["$value"];
          $curl_request_headers[]="$key: $server_value";
       }
    };
    $curl_request_headers[]="Expect: ";

    session_write_close();
    $data = "action=login&lgname=Wiki&lgpassword=gjnlt&lgtoken=5ae555656110dd20a2b0504e4d7e35e0";  // login
    $ch = curl_init('http://192.168.1.32/Eb_new/mediawiki/api.php?format=json');
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $curl_request_headers);
    //curl_setopt($curl_handle, CURLOPT_COOKIE, 'enwikiSession='.$sessionid.' ;domain=http://192.168.1.32/Eb_new/mediawiki');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    echo $result = curl_exec($ch);
}

但是用户没有登录。我哪里错了。任何帮助将不胜感激 。谢谢

【问题讨论】:

  • 您省略了第二个响应。它可能包含NeedCaptcha 错误。此外,您正在设置一个enwikiSession cookie,但您的目标 wiki 实际上称为 enwiki 吗?一般来说,OAuth(例如Extension:OAuthAuthentication)通常比使用登录 API 更好。

标签: php session curl mediawiki-api


【解决方案1】:

登录请求的结构

使用 POST 发送登录请求(GET 请求会导致错误)。

api.php?action=login&lgname=Bob&lgpassword=secret [试试[ApiSandbox] ][1] 结果

{
"login": {
    "result": "NeedToken",
    "token": "b5780b6e2f27e20b450921d9461010b4",
    "cookieprefix": "enwiki",
    "sessionid": "17ab96bd8ffbe8ca58a78657a918558e"
}
}

POST 的正文可以为空。此请求还将在 HTTP 标头中返回会话 cookie

(Set-Cookie: enwikiSession=17ab96bd8ffbe8ca58a78657a918558e; path=/; domain=.wikipedia.org; HttpOnly) 

如果您的框架没有自动执行此操作,您必须返回第二个请求。在 MediaWiki 1.17 及更高版本中添加了 sessionid 参数。

https://en.wikipedia.org/wiki/Special:ApiSandbox#action=login&lgname=Bob&lgpassword=secret

【讨论】:

  • 我正在使用 post 方法。检查我的问题
  • 我已经给出了 post 方法的例子,上面给出的请求将通过 Post 方法发送
【解决方案2】:

我发现您在上述代码中的任何地方都没有开始会话。

您需要在要检索价值会话为会话设置价值的每个页面上添加session_start()

Ref

【讨论】:

  • 我已经在顶部开始了它,但没有提到任何问题。对此感到抱歉
猜你喜欢
  • 1970-01-01
  • 2012-02-01
  • 2012-12-15
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多