Problem
We had to do a lot of calls from our local Node Server to the Appcelerator Cloud to get the data exported from Dev, cleaned up and uploaded to Production. All worked fine for a while but then suddenly I started getting a “User Not Authenticated” error.
When debugging I still found that the user is actually logged in but fails when either doing a delete, create or update to Appcelerator Cloud. After a lot of troubleshooting I figured out that the Session Id from the Login Service was not being maintained across the different ACS calls.
Resolution
First thing is to create a global variable to store your sessionId:
var sessionId = "";
Then I create a normal login function to ACS and assign the sessionId to my variable:
The important part here is: sessionId = data.meta.session_id;
function _loginUser(req, res, options) {
ACS.Users.login({
login: username,
password: password
}, function (data) {
if (data.success) {
//This is the important bit that needed to be added
sessionId = data.meta.session_id;
_StartDataImport(req, res, options);
} else {
var errorMessage = ["Incorrect username and password"];
_ReturnResult(res, 400, errorMessage);
}
}, req, res);
}
When performing a service call to the Appcelerator Cloud you then pass this stored variable:
The important part here is: session_id: sessionId,
function _DeleteRows(req, res) {
ACS.Objects.remove({
session_id: sessionId,
classname: tableName,
ids: itemsToDelete.join(",")
}, function (deletedRows) {
if (deletedRows.success) {
_ReturnResult(res, 200, ("All rows deleted!");
} else {
_ReturnResult(res, 200, deletedRows);
}
}, req, res);
}
When you run your Node.ACS application now you will find that the authentication problem is no more. I did notice in my Google ventures that other login problems also occur, but this was the one that fixed everything for me.