我正在编写一些移动应用程序来帮助我大学的学生通过移动设备访问资源。用户登录后我的一切正常运行,但我仍然无法弄清楚如何重新设计登录页面。现在,登录的唯一方法是打开登录页面的webview
。我希望能够POST
将登录信息直接发送到该页面,这样我就不必打开登录webview
。
长话短说 - 这个资源的登录页面不仅传递了UserID和Password,还传递了一个我无法想象的随机UUID变量。它随着每个会话而变化,我无法找到任何模式。现在,我尝试使用GET
拉取页面并从源中提取此UUID,然后使用POST
将其与登录信息一起发回,但它失败了。
以下是登录页面的来源(为了节省空间,我删除了源的无关部分):
<html>
<head>
<script language="javascript1.1">
var clientServerDelta = (new Date()).getTime() - 1403699390279; <!--this number changes with every load? -->
function login()
{
setQueryAsCookie();
document.cplogin.user.value=document.userid.user.value;
if ( document.cplogin.uuid )
{
document.cplogin.uuid.value=(new Date()).getTime() - clientServerDelta;
}
document.cplogin.submit();
}
</script>
<div id="loginBox">
<table border="0" cellpadding="2" cellspacing="0" width="100%">
<tr>
<td align="center">
<table border="0" cellpadding="4" cellspacing="0" width="100%">
<form name="userid" onSubmit="xferFocus(this); return false;">
<tr>
<td align="right" width="40%"><span class="style1"><b>
<label for="user" accesskey="u">User Name</label>:</b></span></td>
<td align="left" width="60%">
<span class="text10">
<script language="JavaScript1.2">
document.writeln("<input class=\"textform\" type=\"text\" id=\"user\" name=\"user\" size=\"" + size + "\" tabindex=1 onFocus=\"hadFocus(true)\">");
</script>
</span>
</td>
</tr>
</form>
<form name="cplogin" action="https://<website>/login" onSubmit="login(); return false;" method="post">
<tr>
<td align="right"><span class="style1"><b>
<label for="pass" accesskey="p">Password</label>:</b></span></td>
<td align="left">
<span class="text10">
<script language="JavaScript1.2">
document.writeln("<input class=\"textform\" type=\"password\" id=\"pass\" name=\"pass\" size=\"" + size + "\" tabindex=2 onFocus=\"hadFocus(true);\">");
</script><input type="hidden" name="user" value=""><input type="hidden" name="uuid" value=""/>
</span>
</td>
</tr>
</form>
</table>
</td>
</tr>
</table>
</div>
我可能在那里有太多的结束标签,但无论如何,代码的基础就在那里;结束标签并不意味着太多。无论如何,当我捕获POST
流时,它将用户ID,密码和uuid传递给/ login。我似乎无法弄清楚是什么产生了UUID。
编辑:
想出来! SunGard的流程在此处的评论中进行了描述:https://www.lumdev.net/node/9994。
根据Lumdev的novosirj:&#34;阅读代码,看起来它看起来像是以纪元毫秒为单位的当前日期,减去它从客户端获得的值(这也非常看起来像epoch毫秒),并调用clientServerDelta,然后从新生成的日期中减去该差异,并在epoch毫秒内获得大致另一个值(这是我失踪的部分 - 它在几秒钟内不起作用,而是。毫秒)&#34;
硬编码的UUID值始终会传递有效的会话ID:0xACA021。我刚刚在POST
中传递了该值以及我的登录信息,果然,我登录了。真棒!
答案 0 :(得分:0)
我相信你有一些选择如何实现这个,但首先提醒一下:
每次您的移动客户端通过GET进行身份验证时,它都会发送身份验证对。它也可能被视为安全问题。
那就是说,让我们试着解决你的问题。
uuid将会话联系在一起,它是一个随机生成的值。所以,从理论上讲,你应该:
之后,您应该将捕获的uuid作为所有GET请求的一部分发送。
但是,您可能会遇到一些问题; uuid在一段时间不活动后到期,用户需要重新进行身份验证。您可以配置会话TTL(生存时间),以便在这方面留出更多余地。