Authentication for xhr request for Appcelerator Titanium is difficult. During my latest bout with the cross platform mobile app platform I discovered that XHR request header variable names get renamed (aka case changes).
For the auth part of the app being worked on requires sending a Session Key for authorization for every request after the user is logged in. For a good tutorial on how a more basic authorization might work go check out Titanium User Authentication. In any case request headers sent from Titanium are re-cased i.e. "UserAuthKey" becomes "Userauthkey".
To discover this lil gem of a problem after hours of poking I chose to find and use a logging utility to see what was actually being sent.
Below is a quick php POST logging utility from CodeWord with headers added. This logging utility serializes the incoming Post request to a logs directory. It makes it easy to see the variables being passed in and headers.
To use, create a php file called xhrlog.php. Upload to your favorite testing server. Ensure you have a directory called "logs". Then submit your xhr POST requests to MYDOMAIN.com/xhrlog.php from php, html, android, titanium.. wherever and it'll log it for you!
<?php
/*function from http://blog.apokalyptik.com/2008/03/25/logging-post-data/comment-page-1/
Creates a log file of the POST request
*/
if ( isset($_POST) && is_array($_POST) && count($_POST) > 0 ) {
$log_dir = dirname( __FILE__ ) . '/logs/';
$log_name = "posts-" . $_SERVER['REMOTE_ADDR'] . "-" . date("Y-m-d-H") . ".log";
$log_entry = gmdate('r') . "\t" .serialize(parseRequestHeaders())."\n ". $_SERVER['REQUEST_URI'] . "\r\n" . serialize($_POST) . "\r\n\r\n";
$fp=fopen( $log_dir . $log_name, 'a' );
fputs($fp, $log_entry);
fclose($fp); }
/*
function copied from stackoverflow http://stackoverflow.com/questions/541430/how-do-i-read-any-request-header-in-php
Parses html request headers
*/
function parseRequestHeaders() {
$headers = array();
foreach($_SERVER as $key => $value) {
if (substr($key, 0, 5) <> 'HTTP_') {
continue;
}
$header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
$headers[$header] = $value;
}
return $headers;
}
?>

No comments:
Post a Comment