我对流程的理解:
来自 mediawikis 登录手册https://www.mediawiki.org/wiki/API:登录 https://www.mediawiki.org/wiki/API:Login
使用 MediaWiki 的 Web 服务 API 时,您可能需要应用程序或客户端登录。这涉及提交登录查询、构建 cookie,以及通过重新提交登录请求并返回确认令牌来确认登录。
1) 尝试使用用户名和密码登录,这将失败,并在响应 html 中显示“result="NeedToken"”。响应还将包含下次登录尝试时传入的令牌。
2)再次尝试登录,这次除了un/pw之外还传入token。这应该返回“结果=“成功””
My code:
###Attempt first login setup cookie jar
loginRes1=$(curl --cookie-jar cjar -X POST "$domain/wiki/api.php?action=login&lgname=$lgname&lgpassword=$lgpassword")
###Grab the token from login attempt
lgtoken=$(echo $loginRes1 |sed -rn "s/.*token="([0-9a-zA-Z]+)".*/\1/p" )
###Attempt second login, this time passing token as well
loginRes2=$(curl --cookie-jar cjar -X POST "$domain/wiki/api.php?action=login&lgname=$lgname&lgpassword=$lgpassword&lgtoken=$lgtoken")
Result:
echo $loginRes1
###Only relevant html from echo shown below, cleaned up into xml syntax
<?xml version="1.0"?> <api> <login result="NeedToken" token="944af711913a037cfb8b90d477d51f6c" cookieprefix="ronk" sessionid="isqvhm955lj35g1q2e2klme091" /> </api>
echo $loginRes2
###Only relevant html from echo shown below, cleaned up into xml syntax
<?xml version="1.0"?> <api> <login result="NeedToken" token="ffdd1aa6dc3699df26b9de6dd1c6d5a5" cookieprefix="ronk" sessionid="fdahoh4gh7junrqm1tk2p1qd25" /> </api>
我第二次仍然得到 NeedToken 结果,而不是我期望的成功。
通过浏览器登录
我可以使用表单提交的浏览器正常登录,post请求包含4个参数:wpName、wpPassword、wpLoginAttempt、wpLoginToken
wpName=myName&wpPassword=myPassword&wpLoginAttempt=Log+in&wpLoginToken=d3fe3a1de6fbc934acd3039149f3c56d
其他注意事项
1)我确认通过浏览器正常登录时un/pw可以工作。
2)我不清楚我是否正确使用了curl cookie-jar语法
3) 我不知道我正在连接的 mediawiki 版本,它是最近安装的,可能是最高的稳定版本。
4)您会注意到,在成功的浏览器尝试中,参数具有 wp 前缀而不是 lg,如果我更改curl 尝试以匹配(即 wpName、wpPassword),则返回的结果为:
<?xml version="1.0"?> <api> <warnings> <main xml:space="preserve">Unrecognized parameters: 'wpName', 'wpPassword'</main> </warnings> <login result="NoName" /> </api>