-
-
Save pomu0325/1490519 to your computer and use it in GitHub Desktop.
(function(){ | |
var o = {}; | |
o.open = function(clientId) { | |
o.clientId = clientId; | |
FDC.ForceOAuth.open(clientId); | |
}; | |
o.apiVersion = FDC.ForceOAuth.apiVersion; | |
o.makeRestCall = function (path, callback, error, method, payload, retry) { | |
if (!o.instanceUrl) { | |
var oauthData = Ti.App.Properties.getString("oauthData_preference"); | |
var oauthJ = JSON.parse(oauthData); | |
o.instanceUrl = oauthJ.instance_url; | |
o.accessToken = oauthJ.access_token; | |
o.refreshToken = oauthJ.refresh_token; | |
} | |
var restUrl=Ti.Network.decodeURIComponent(o.instanceUrl)+'/services'+path; | |
var xhr=Ti.Network.createHTTPClient(); | |
xhr.onload=function(){ | |
Ti.API.info("REST Response: "+this.responseText); | |
var data=""; | |
if(this.responseText){data=this.responseText;} | |
callback(data); | |
}; | |
xhr.onerror=function(e){ | |
Ti.API.error("XHR, error handler..."+"\nDbDotCom.REST.OAuth.refreshToken: "+o.refreshToken+"\nretry: "+retry+"\n e: "+e.error+"\nXHR status: "+this.status);if(!o.refreshToken||retry){error(e.error); | |
}else{ | |
Ti.API.error("In the error handler looking for a 401, and have a "+xhr.status); | |
if(xhr.status===401){ | |
Ti.API.error("Handleing the 401 error..."); | |
o.refreshAccessToken(function(oauthResponse){ | |
Ti.API.error("Refresh response... "+oauthResponse); | |
o.makeRestCall(path,callback,error,method,payload,true); | |
},error); | |
}else{ | |
Ti.API.error("Not a 401 error, re-throwing...");error(e); | |
} | |
} | |
}; | |
xhr.open(method||"GET",restUrl,true) | |
Ti.API.info("Rest url: "+restUrl); | |
xhr.setRequestHeader("Authorization","OAuth "+Ti.Network.decodeURIComponent(o.accessToken)); | |
xhr.setRequestHeader("Content-Type","application/json"); | |
xhr.send(payload); | |
}; | |
o.refreshAccessToken = function(callback, onerror) { | |
var url = 'https://login.salesforce.com/services/oauth2/token'; | |
var qs = '?grant_type=refresh_token&client_id=' + o.clientId + '&refresh_token=' + o.refreshToken; | |
var xhr = Ti.Network.createHTTPClient(); | |
xhr.onload = function(){ | |
Ti.API.debug(xhr.responseText); | |
var j = JSON.parse(xhr.responseText); | |
j.refresh_token = o.refreshToken; | |
o.accessToken = j.access_token; | |
Ti.App.Properties.setString('oauthData_preference', JSON.stringify(j)); | |
FDC.ForceOAuth.setOAuthData(j); | |
callback(xhr.responseText); | |
}; | |
xhr.onerror = onerror; | |
xhr.open('POST', url + qs); | |
xhr.send(); | |
}; | |
o.query = function (soql, callback, error) {o.makeRestCall('/data/v'+o.apiVersion+'/query/?q='+escape(soql),callback,error,"GET");} | |
FDC.ForceOAuth2 = o; | |
})(); |
use this like:
var FDC = require('com.salesforce');
Ti.include('fdc-patch.js');
FDC.ForceOAuth2.open('CLIENT_ID', 'CLIENT_SECRET');
as far as I tested, the original toolkit does not handle "refresh token" properly, and ends up with logging 401 error messages.. :(
https://marketplace.appcelerator.com/apps/836?1897798640#questions
Thank you for the quick reply. I am still having issues with this thing. Below is the code that I am using with Dev Account in SF:
FDC = require('com.salesforce');
Ti.include('fdc-patch.js');
FDC.ForceOAuth2.open('3MVG9y6x0357HlefBtivwCfw64JZbW5NOvYNkQXcHY9H38fLihuJiCAE6mHuuZdzftJ_L_tuMhg==', '7990050930547381579');
FDC.ForceOAuth2.query("select id, name, billingCity, billlingState from Account", function(e) {
for (var i=0; i < e.records.length; i++)
{
tableData.push( Ti.UI.createTableViewRow({title:e.records[i].name}));
}
}, function(e) {
Ti.API.debug(e);
});
var tableview = Titanium.UI.createTableView({
data:tableData
});
And here is Error Out put that I get:
[INFO] Salesforce/1.0 (2.0.1.GA2.999c68a)
[INFO] [object ComSalesforceModule] loaded
[INFO] OAuth Data String: {"access_token":"00DE0000000YCVH%21AQ0AQAm97TZ8Sja2Kl0pJmIM2ZGQ_RhDFWHwYaNZey5WLqyG05DOanmuQ8dYpBJEXwaLyKcSBWyDk6X_JwCiPPtiEDdt7JHh", "refresh_token":"5Aep861rEpScxnNE64xeqQ1jBsxOFB2rIxGXSMrNbE68PJhzSB0zvba.nZLWR8w94ol5KE07GwanA%3D%3D", "instance_url":"https%3A%2F%2Fna9.salesforce.com", "id":"https%3A%2F%2Flogin.salesforce.com%2Fid%2F00DE0000000YCVHMA4%2F005E0000000e8zQIAQ", "issued_at":"1337365120234", "signature":"TQYrlxR1eMvRnfWGuIK6ECV3WxWHGBOAouKZKwgJvmk%3D"}
[INFO] Calling oauth success event...https%3A%2F%2Fna9.salesforce.com
[INFO] Rest url: https://na9.salesforce.com/services/data/v22.0/query/?q=select%20id%2C%20name%2C%20billingCity%2C%20billlingState%20from%20Account
[ERROR] XHR, error handler...
DbDotCom.REST.OAuth.refreshToken: 5Aep861rEpScxnNE64xeqQ1jBsxOFB2rIxGXSMrNbE68PJhzSB0zvba.nZLWR8w94ol5KE07GwanA%3D%3D
retry: undefined
e: undefined
XHR status: 400
[ERROR] In the error handler looking for a 401, and have a 400
[ERROR] Not a 401 error, re-throwing...
Hope you can shed some light on to this.
Thanks,
Venkat
sorry, i forgot to mention that you need to use "makeRestCall" method directly.
like:
FDC.ForceOAuth2.makeRestCall('/data/v22.0/query/?...', function(e) {...});
client_secret no more needed for refresh.
How do I use this. Is there an issue with the tool kit that is on Appcelerator market place? I am not able to successfully use that took kit so far. It is always dumping the message "Authentication needed" and never shows the login screen from SF.