Created
April 22, 2015 01:42
-
-
Save iotashan/653cc65c62ad427b6ede to your computer and use it in GitHub Desktop.
LinkedIn auth for Titanium
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* LinkedIn account authentfication library / module | |
* by Miroslav Magda, blog.ejci.net, | |
* | |
* | |
* Copyright 2012 Miroslav Magda | |
* | |
* All code is open source and dual licensed under GPL and MIT. Check the individual licenses for more information. | |
*/ | |
/* | |
* LinkedIn authentification for Titanium | |
* based on: https://github.com/ejci/Google-Auth-for-Titanium | |
* Check also https://code.google.com/apis/console/ | |
*/ | |
var LinkedInAuth = function(o) { | |
var _version = '0.3.2'; | |
o = (o) ? o : {}; | |
var _opt = { | |
clientId : (o.clientId) ? o.clientId : null, | |
clientSecret : (o.clientSecret) ? o.clientSecret : null, | |
propertyName : (o.propertyName) ? o.propertyName : 'linkedinToken', | |
url : 'https://www.linkedin.com/uas/oauth2/authorization', | |
scope : (o.scope) ? o.scope : ['r_basicprofile'], | |
closeTitle : (o.closeTitle) ? o.closeTitle : 'Close', | |
errorText : (o.errorText) ? o.errorText : 'Can not authorize user!', | |
quiet : ( typeof (o.quiet) === 'undefined') ? true : o.quiet, | |
}; | |
var log = function() { | |
}; | |
log.error = function(t) { | |
if (!_opt.quiet) { | |
Ti.API.error('' + t); | |
} | |
}; | |
log.info = function(t) { | |
if (!_opt.quiet) { | |
Ti.API.info(t); | |
} | |
}; | |
log.debug = function(t) { | |
if (!_opt.quiet) { | |
Ti.API.debug('' + t); | |
} | |
}; | |
log.trace = function(t) { | |
if (!_opt.quiet) { | |
Ti.API.trace('' + t); | |
} | |
}; | |
//UTILS | |
log.info('-------------------------------------'); | |
log.info('| LinkedIn Account Authentification |'); | |
log.info('| Titanium Module (v.:' + _version + ') |'); | |
log.info('| by Miroslav Magda |'); | |
log.info('-------------------------------------'); | |
var win; | |
var _prop = {}; | |
_prop.accessToken = null; | |
_prop.refreshToken = null; | |
_prop.tokenType = null; | |
_prop.expiresIn = 0; | |
var prop = {}; | |
prop = getProps(); | |
if (prop.expiresIn >= (new Date()).getTime()) { | |
log.info('LinkedInAuth: Access code valid'); | |
_prop = prop; | |
}/*else { | |
log.info('LinkedInAuth: Access code not valid. Refreshing...'); | |
_prop = prop; | |
refreshToken(); | |
}*/ | |
function reset() { | |
Ti.App.Properties.removeProperty(_opt.propertyName + '.accessToken'); | |
Ti.App.Properties.removeProperty(_opt.propertyName + '.refreshToken'); | |
Ti.App.Properties.removeProperty(_opt.propertyName + '.tokenType'); | |
Ti.App.Properties.removeProperty(_opt.propertyName + '.expiresIn'); | |
} | |
function getProps() { | |
var p = {}; | |
p.accessToken = Ti.App.Properties.getString(_opt.propertyName + '.accessToken'); | |
p.refreshToken = Ti.App.Properties.getString(_opt.propertyName + '.refreshToken'); | |
p.tokenType = Ti.App.Properties.getString(_opt.propertyName + '.tokenType'); | |
p.expiresIn = Ti.App.Properties.getString(_opt.propertyName + '.expiresIn'); | |
return p; | |
} | |
function authorize(cb) { | |
cb = (cb) ? cb : function() { | |
}; | |
var url = prepareUrl(); | |
Ti.Platform.openURL(url); | |
} | |
/** | |
* Refresh token | |
*/ | |
function refreshToken(cbSuccess, cbError) { | |
log.info('LinkedInAuth: Access code not valid. Refreshing...'); | |
cbSuccess = (cbSuccess) ? cbSuccess : function() { | |
}; | |
cbError = (cbError) ? cbError : function() { | |
}; | |
var xhr = Ti.Network.createHTTPClient({ | |
// function called when the response data is available | |
onload : function(e) { | |
//log.info("Received text: " + this.responseText); | |
var resp = JSON.parse(this.responseText); | |
resp.expires_in = parseFloat(resp.expires_in, 10) * 1000 + (new Date()).getTime(); | |
Ti.App.Properties.setString(_opt.propertyName + '.accessToken', resp.access_token); | |
Ti.App.Properties.setString(_opt.propertyName + '.tokenType', resp.token_type); | |
Ti.App.Properties.setString(_opt.propertyName + '.expiresIn', resp.expires_in); | |
_prop.accessToken = resp.access_token; | |
_prop.tokenType = resp.token_type; | |
_prop.expiresIn = resp.expires_in; | |
log.debug(_prop); | |
cbSuccess(); | |
}, | |
// function called when an error occurs, including a timeout | |
onerror : function(e) { | |
log.info(e.error); | |
log.info(e.responseText); | |
cbError(); | |
//ERROR | |
Titanium.UI.createAlertDialog({ | |
title : 'Error', | |
message : _opt.errorText | |
}); | |
//authorize(); | |
}, | |
timeout : 5000 /* in milliseconds */ | |
}); | |
// Prepare the connection. | |
xhr.open("POST", _opt.url); | |
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); | |
var d = { | |
client_id : _opt.clientId, | |
client_secret : _opt.clientSecret, | |
refresh_token : _prop.refreshToken, | |
grant_type : 'refresh_token' | |
}; | |
// Send the request. | |
xhr.send(d); | |
} | |
/** | |
* Get TOKEN | |
*/ | |
function getToken(code, cb) { | |
cb = (cb) ? cb : function() { | |
}; | |
var xhr = Ti.Network.createHTTPClient({ | |
// function called when the response data is available | |
onload : function(e) { | |
//log.info("Received text: " + this.responseText); | |
var resp = JSON.parse(this.responseText); | |
log.info(resp.expires_in); | |
resp.expires_in = parseFloat(resp.expires_in, 10) * 1000 + (new Date()).getTime(); | |
log.info(resp.expires_in); | |
Ti.App.Properties.setString(_opt.propertyName + '.accessToken', resp.access_token); | |
Ti.App.Properties.setString(_opt.propertyName + '.refreshToken', resp.refresh_token); | |
Ti.App.Properties.setString(_opt.propertyName + '.tokenType', resp.token_type); | |
Ti.App.Properties.setString(_opt.propertyName + '.expiresIn', resp.expires_in); | |
_prop.accessToken = resp.access_token; | |
_prop.refreshToken = resp.refresh_token; | |
_prop.tokenType = resp.token_type; | |
_prop.expiresIn = resp.expires_in; | |
log.debug(_prop); | |
//alert('success'); | |
//callback | |
cb(); | |
}, | |
// function called when an error occurs, including a timeout | |
onerror : function(e) { | |
//log.info(e.error); | |
//log.info(e.responseText); | |
//TODO: show some error message | |
Titanium.UI.createAlertDialog({ | |
title : 'Error', | |
message : _opt.errorText | |
}); | |
}, | |
timeout : 5000 /* in milliseconds */ | |
}); | |
// Prepare the connection. | |
xhr.open("POST", 'https://www.linkedin.com/uas/oauth2/accessToken'); | |
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); | |
var d = { | |
code : code, | |
client_id : _opt.clientId, | |
client_secret : _opt.clientSecret, | |
redirect_uri : 'http://www.yoursite.com/mobileredirect/', // TODO: you need a public web URL that will redirect to your app's URL pattern, like myapp:// | |
grant_type : 'authorization_code' | |
}; | |
// Send the request. | |
xhr.send(d); | |
} | |
/** | |
* Prepare url from options | |
*/ | |
function prepareUrl() { | |
//encodeURIComponent(_opt.scope.join('+')) | |
var scope = []; | |
for (var i = 0; i < _opt.scope.length; i++) { | |
scope[i] = encodeURIComponent(_opt.scope[i]); | |
} | |
// var url = _opt.url + '?' + 'approval_prompt=force&scope=' + scope.join('+') + '&' + 'redirect_uri=urn:ietf:wg:oauth:2.0:oob' + '&' + 'response_type=code' + '&' + 'client_id=' + _opt.clientId + '&' + 'btmpl=mobile' + ''; | |
var url = _opt.url + '?' + 'approval_prompt=force&scope=' + scope.join('+') + '&' + 'redirect_uri=http%3A%2F%yoursite.com%mobileredirect%2F' + '&' + 'response_type=code' + '&' + 'client_id=' + _opt.clientId + '&' + 'btmpl=mobile' + '&' + 'state=iuq873iyhjks' + ''; // TODO: you need a public web URL that will redirect to your app's URL pattern, like myapp:// | |
if (_opt.loginHint) { | |
url = url + '&' + 'login_hint=' + encodeURIComponent(_opt.loginHint); | |
} | |
log.debug(url); | |
return url; | |
} | |
function isAuthorized(cbSuccess, cbError) { | |
cbSuccess = (cbSuccess) ? cbSuccess : function() { | |
}; | |
cbError = (cbError) ? cbError : function() { | |
}; | |
_prop = getProps(); | |
log.debug('Properties: ' + JSON.stringify(_prop)); | |
if (_prop.accessToken != null && _prop.accessToken != '') { | |
if (_prop.expiresIn < (new Date()).getTime()) { | |
refreshToken(cbSuccess, cbError); | |
} else { | |
cbSuccess(); | |
} | |
return true; | |
} else { | |
cbError(); | |
} | |
return false; | |
} | |
function getAccessToken() { | |
return _prop.accessToken; | |
} | |
return { | |
isAuthorized : isAuthorized, | |
processCode : getToken, | |
getAccessToken : getAccessToken, | |
refreshToken : refreshToken, | |
authorize : authorize, | |
version : _version, | |
reset : reset, | |
}; | |
}; | |
module.exports = LinkedInAuth; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
can you give me an example for how to call the app from website? even I can do it, but seems the parameters also can't pass to the app, and the linkedin also show the redirect url is invalid, i have changed to my website's link