Here is the client code in Javascript for a PhoneGap mobile app using all
the web2py mods and controller code I have previously posted.
Hopefully it is straight forward to convert to C++ or C# for a Windows
client app as well:
It uses the HTML 5 feature "window.localStorage" instead of cookies.
function xmlhttpPostloginrequest(strURL, username, password) {
var xmlHttpReq = false;
var self = this;
// Mozilla/Safari
if (window.XMLHttpRequest) {
self.xmlHttpReq = new XMLHttpRequest();
}
// IE
else if (window.ActiveXObject) {
self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
self.xmlHttpReq.open('POST', strURL, false, username, password);
self.xmlHttpReq.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
self.xmlHttpReq.onreadystatechange = function() {
if (self.xmlHttpReq.readyState == 4) {
debugger;
var restext = self.xmlHttpReq.responseText;
var resdict = JSON.parse(restext);
var res = resdict["IsLoggedIn"];
var rescookiename =
resdict["sessioncookiename_fromweb2py"];
var ressession_record_id = resdict["session_record_id_fromweb2py"];
var ressession_guid = resdict["session_guid_fromweb2py"];
var resmsg = resdict["resmsg"];
if (res == 'True') {
//store
window.localStorage["username"] = username;
window.localStorage["password"] = password;
window.localStorage["sessioncookiename_fromweb2py"] =
rescookiename; // retrieve these values for checkisloggedin() and do
self.xmlHttpReq.setRequestHeader()
window.localStorage["sessioncookieval_fromweb2py"] =
ressession_record_id + ':' + ressession_guid;
// Now we are logged in...
$.mobile.changePage("#mainPage"); // "mainPage" is
your first application page of business logic (html for mainPage is NOT
shown in this posting)
} else {
navigator.notification.alert("Your login failed",
function() { });
}
$("#submitButton").removeAttr("disabled");
}
}
var rawcred = make_base_auth(username, password)
var rawcredhtmlEncoded = htmlEncode(rawcred);
var qscred = "cred=" + rawcredhtmlEncoded;
var session_record_id_fromweb2py =
window.localStorage["session_record_id_fromweb2py"];
var session_guid_fromweb2py =
window.localStorage["session_guid_fromweb2py"];
var sessioncookieval_fromweb2py = session_record_id_fromweb2py.toString()
+ ':' + session_guid_fromweb2py;
window.localStorage["sessioncookieval_fromweb2py"] =
sessioncookieval_fromweb2py;
var datatosend = 'sessioncookieval_fromweb2py=' +
sessioncookieval_fromweb2py + '&' + qscred ;
self.xmlHttpReq.send(datatosend);
} // xmlhttpPostloginrequest()
function handleLogin() {
var form = $("#loginForm");
//disable the button so we can't resubmit while we wait
$("#submitButton", form).attr("disabled", "disabled");
var u = $("#username", form).val();
var p = $("#password", form).val();
var urlpw = "http://localhost:8080/init/default/login_mobile";
if (u != '' && p != '') {
xmlhttpPostloginrequest(urlpw, u, p);
} else {
navigator.notification.alert("You must enter a username and
password", function () { });
$("#submitButton").removeAttr("disabled");
}
return false;
} // handleLogin()
function xmlhttpPostcheckisloggedinrequest(strURL) {
var xmlHttpReq = false;
var self = this;
// Mozilla/Safari
if (window.XMLHttpRequest) {
self.xmlHttpReq = new XMLHttpRequest();
}
// IE
else if (window.ActiveXObject) {
self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
self.xmlHttpReq.open('POST', strURL, false);
var rescookiename = "";
var rescookieval = "";
if (window.localStorage["sessioncookiename_fromweb2py"] !=
undefined && window.localStorage["sessioncookieval_fromweb2py"] !=
undefined) {
rescookiename =
window.localStorage["sessioncookiename_fromweb2py"];
rescookieval =
window.localStorage["sessioncookieval_fromweb2py"];
}
self.xmlHttpReq.onreadystatechange = function() {
if (self.xmlHttpReq.readyState == 4) {
debugger;
var restext = self.xmlHttpReq.responseText;
if (restext == "") {
$.mobile.changePage("#loginPage");
}
else {
var resdict = JSON.parse(restext);
var res = resdict["IsLoggedIn"];
var ressession_record_id_fromweb2py =
resdict["session_record_id_fromweb2py"];
var ressession_guid_fromweb2py = resdict["session_guid_fromweb2py"];
window.localStorage["session_record_id_fromweb2py"] =
ressession_record_id_fromweb2py;
window.localStorage["session_guid_fromweb2py"] =
ressession_guid_fromweb2py;
var sessioncookieval_fromweb2py =
ressession_record_id_fromweb2py.toString() + ':' +
ressession_guid_fromweb2py;
window.localStorage["sessioncookieval_fromweb2py"] =
sessioncookieval_fromweb2py;
var resmsg = resdict["resmsg"];
if (res == 'True') {
$.mobile.changePage("#mainPage");
}
else {
$.mobile.changePage("#loginPage");
}
}
}
return false;
}
self.xmlHttpReq.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
// send session id
if (rescookieval == "") {
self.xmlHttpReq.send("checkIsLoggedIn=firstTimeCreateSession");
}
else {
if (window.localStorage["username"] != undefined &&
window.localStorage["password"] != undefined) {
var username = window.localStorage["username"];
var password = window.localStorage["password"];
var rawcred = make_base_auth(username, password)
var rawcred_nonbasic = rawcred.replace('Basic ', '');
var unquotedval = rescookieval.replace('"',
'').replace('"', '');
var quotesplit = unquotedval.split(":");
var session_record_id_fromweb2py =
window.localStorage["session_record_id_fromweb2py"];
var session_key_tuple = session_record_id_fromweb2py + ':' + quotesplit[1];
var postargs = 'sessioncookieval_fromweb2py=' + session_key_tuple + '&' +
'cred=' + rawcred_nonbasic;
self.xmlHttpReq.send(postargs);
}
else {
self.xmlHttpReq.send(rescookiename + "=" + rescookieval);
}
}
return false;
} // xmlhttpPostcheckisloggedinrequest()
function checkisloggedin() {
//disable the button so we can't resubmit while we wait
var form = $("#connectForm");
$("#submitConnect", form).attr("disabled", "disabled");
var url = "http://localhost:8080/init/default/isloggedin_mobile";
xmlhttpPostcheckisloggedinrequest(url);
return false;
} // checkisloggedin()
</script>
<script type="text/javascript">
// Initialiation code - in PhoneGap app, the following code would go in the
onDeviceReady() method:
$("#connectPage").on("pageinit", function() {
$("#loginForm").one("submit", handleLogin);
$("#connectForm").one("submit", checkisloggedin);
});
$.mobile.changePage("#connectPage");
</script>
<!-- The html, using mustouche.js templating is: -->
<div id="connectPage" data-role="page">
<div data-role="header">
<h1>Auth Demo Connect Page</h1>
</div>
<div data-role="content">
<form id="connectForm" action="">
<div>
<label for="username">click submit to connect:</label>
</div>
<input type="submit" id="submitConnect" value="Connect" />
</form>
</div>
</div>
<div id="loginPage" data-role="page">
<div data-role="header">
<h1>Auth Demo</h1>
</div>
<div data-role="content">
<form id="loginForm" action="">
<div data-role="fieldcontain" class="ui-hide-label">
<label for="username">Username:</label>
<input type="text" name="username" id="username" value=""
placeholder="Username" />
</div>
<div data-role="fieldcontain" class="ui-hide-label">
<label for="password">Password:</label>
<input type="password" name="password" id="password" value=""
placeholder="Password" />
</div>
<input type="submit" id="submitButton" value="Login" />
</form>
</div>
</div>
--