Skip to content

Instantly share code, notes, and snippets.

@CiscoKidxx
Last active September 23, 2016 20:46
Show Gist options
  • Save CiscoKidxx/6805200945f2378bea0b8674217f5214 to your computer and use it in GitHub Desktop.
Save CiscoKidxx/6805200945f2378bea0b8674217f5214 to your computer and use it in GitHub Desktop.
/**
* Satellizer 0.15.5
* (c) 2016 Sahat Yalkabov
* License: MIT
* Modified by Chris Newell
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.satellizer = factory());
}(this, function () { 'use strict';
var Config = (function () {
function Config() {
this.baseUrl = '/';
this.loginUrl = '/auth/login';
this.signupUrl = '/auth/signup';
this.unlinkUrl = '/auth/unlink/';
this.tokenName = 'token';
this.tokenPrefix = 'satellizer';
this.tokenHeader = 'Authorization';
this.tokenType = 'Bearer';
this.storageType = 'localStorage';
this.tokenRoot = null;
this.withCredentials = false;
this.providers = {
facebook: {
name: 'facebook',
url: '/auth/facebook',
authorizationEndpoint: 'https://www.facebook.com/v2.5/dialog/oauth',
redirectUri: window.location.origin + '/',
requiredUrlParams: ['display', 'scope'],
scope: ['email'],
scopeDelimiter: ',',
display: 'popup',
oauthType: '2.0',
popupOptions: { width: 580, height: 400 }
},
google: {
name: 'google',
url: '/auth/google',
authorizationEndpoint: 'https://accounts.google.com/o/oauth2/auth',
redirectUri: window.location.origin,
requiredUrlParams: ['scope'],
optionalUrlParams: ['display', 'state'],
scope: ['profile', 'email'],
scopePrefix: 'openid',
scopeDelimiter: ' ',
display: 'popup',
oauthType: '2.0',
popupOptions: { width: 452, height: 633 },
state: function () { return encodeURIComponent(Math.random().toString(36).substr(2)); }
},
github: {
name: 'github',
url: '/auth/github',
authorizationEndpoint: 'https://github.com/login/oauth/authorize',
redirectUri: window.location.origin,
optionalUrlParams: ['scope'],
scope: ['user:email'],
scopeDelimiter: ' ',
oauthType: '2.0',
popupOptions: { width: 1020, height: 618 }
},
instagram: {
name: 'instagram',
url: '/auth/instagram',
authorizationEndpoint: 'https://api.instagram.com/oauth/authorize',
redirectUri: window.location.origin,
requiredUrlParams: ['scope'],
scope: ['basic'],
scopeDelimiter: '+',
oauthType: '2.0'
},
linkedin: {
name: 'linkedin',
url: '/auth/linkedin',
authorizationEndpoint: 'https://www.linkedin.com/uas/oauth2/authorization',
redirectUri: window.location.origin,
requiredUrlParams: ['state'],
scope: ['r_emailaddress'],
scopeDelimiter: ' ',
state: 'STATE',
oauthType: '2.0',
popupOptions: { width: 527, height: 582 }
},
twitter: {
name: 'twitter',
url: '/auth/twitter',
authorizationEndpoint: 'https://api.twitter.com/oauth/authenticate',
redirectUri: window.location.origin,
oauthType: '1.0',
popupOptions: { width: 495, height: 645 }
},
twitch: {
name: 'twitch',
url: '/auth/twitch',
authorizationEndpoint: 'https://api.twitch.tv/kraken/oauth2/authorize',
redirectUri: window.location.origin,
requiredUrlParams: ['scope'],
scope: ['user_read'],
scopeDelimiter: ' ',
display: 'popup',
oauthType: '2.0',
popupOptions: { width: 500, height: 560 }
},
live: {
name: 'live',
url: '/auth/live',
authorizationEndpoint: 'https://login.live.com/oauth20_authorize.srf',
redirectUri: window.location.origin,
requiredUrlParams: ['display', 'scope'],
scope: ['wl.emails'],
scopeDelimiter: ' ',
display: 'popup',
oauthType: '2.0',
popupOptions: { width: 500, height: 560 }
},
yahoo: {
name: 'yahoo',
url: '/auth/yahoo',
authorizationEndpoint: 'https://api.login.yahoo.com/oauth2/request_auth',
redirectUri: window.location.origin,
scope: [],
scopeDelimiter: ',',
oauthType: '2.0',
popupOptions: { width: 559, height: 519 }
},
bitbucket: {
name: 'bitbucket',
url: '/auth/bitbucket',
authorizationEndpoint: 'https://bitbucket.org/site/oauth2/authorize',
redirectUri: window.location.origin + '/',
requiredUrlParams: ['scope'],
scope: ['email'],
scopeDelimiter: ' ',
oauthType: '2.0',
popupOptions: { width: 1028, height: 529 }
},
spotify: {
name: 'spotify',
url: '/auth/spotify',
authorizationEndpoint: 'https://accounts.spotify.com/authorize',
redirectUri: window.location.origin,
optionalUrlParams: ['state'],
requiredUrlParams: ['scope'],
scope: ['user-read-email'],
scopePrefix: '',
scopeDelimiter: ',',
oauthType: '2.0',
popupOptions: { width: 500, height: 530 },
state: function () { return encodeURIComponent(Math.random().toString(36).substr(2)); }
}
};
this.httpInterceptor = function () { return true; };
}
Object.defineProperty(Config, "getConstant", {
get: function () {
return new Config();
},
enumerable: true,
configurable: true
});
return Config;
}());
;
var AuthProvider = (function () {
function AuthProvider(SatellizerConfig) {
this.SatellizerConfig = SatellizerConfig;
}
Object.defineProperty(AuthProvider.prototype, "baseUrl", {
get: function () { return this.SatellizerConfig.baseUrl; },
set: function (value) { this.SatellizerConfig.baseUrl = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "loginUrl", {
get: function () { return this.SatellizerConfig.loginUrl; },
set: function (value) { this.SatellizerConfig.loginUrl = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "signupUrl", {
get: function () { return this.SatellizerConfig.signupUrl; },
set: function (value) { this.SatellizerConfig.signupUrl = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "unlinkUrl", {
get: function () { return this.SatellizerConfig.unlinkUrl; },
set: function (value) { this.SatellizerConfig.unlinkUrl = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "tokenRoot", {
get: function () { return this.SatellizerConfig.tokenRoot; },
set: function (value) { this.SatellizerConfig.tokenRoot = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "tokenName", {
get: function () { return this.SatellizerConfig.tokenName; },
set: function (value) { this.SatellizerConfig.tokenName = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "tokenPrefix", {
get: function () { return this.SatellizerConfig.tokenPrefix; },
set: function (value) { this.SatellizerConfig.tokenPrefix = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "tokenHeader", {
get: function () { return this.SatellizerConfig.tokenHeader; },
set: function (value) { this.SatellizerConfig.tokenHeader = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "tokenType", {
get: function () { return this.SatellizerConfig.tokenType; },
set: function (value) { this.SatellizerConfig.tokenType = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "withCredentials", {
get: function () { return this.SatellizerConfig.withCredentials; },
set: function (value) { this.SatellizerConfig.withCredentials = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "storageType", {
get: function () { return this.SatellizerConfig.storageType; },
set: function (value) { this.SatellizerConfig.storageType = value; },
enumerable: true,
configurable: true
});
Object.defineProperty(AuthProvider.prototype, "httpInterceptor", {
get: function () { return this.SatellizerConfig.httpInterceptor; },
set: function (value) {
if (typeof value === 'function') {
this.SatellizerConfig.httpInterceptor = value;
}
else {
this.SatellizerConfig.httpInterceptor = function () { return value; };
}
},
enumerable: true,
configurable: true
});
AuthProvider.prototype.facebook = function (options) {
angular.extend(this.SatellizerConfig.providers.facebook, options);
};
AuthProvider.prototype.google = function (options) {
angular.extend(this.SatellizerConfig.providers.google, options);
};
AuthProvider.prototype.github = function (options) {
angular.extend(this.SatellizerConfig.providers.github, options);
};
AuthProvider.prototype.instagram = function (options) {
angular.extend(this.SatellizerConfig.providers.instagram, options);
};
AuthProvider.prototype.linkedin = function (options) {
angular.extend(this.SatellizerConfig.providers.linkedin, options);
};
AuthProvider.prototype.twitter = function (options) {
angular.extend(this.SatellizerConfig.providers.twitter, options);
};
AuthProvider.prototype.twitch = function (options) {
angular.extend(this.SatellizerConfig.providers.twitch, options);
};
AuthProvider.prototype.live = function (options) {
angular.extend(this.SatellizerConfig.providers.live, options);
};
AuthProvider.prototype.yahoo = function (options) {
angular.extend(this.SatellizerConfig.providers.yahoo, options);
};
AuthProvider.prototype.bitbucket = function (options) {
angular.extend(this.SatellizerConfig.providers.bitbucket, options);
};
AuthProvider.prototype.spotify = function (options) {
angular.extend(this.SatellizerConfig.providers.spotify, options);
};
AuthProvider.prototype.oauth1 = function (options) {
this.SatellizerConfig.providers[options.name] = angular.extend(options, {
oauthType: '1.0'
});
};
AuthProvider.prototype.oauth2 = function (options) {
this.SatellizerConfig.providers[options.name] = angular.extend(options, {
oauthType: '2.0'
});
};
AuthProvider.prototype.$get = function (SatellizerShared, SatellizerLocal, SatellizerOAuth) {
return {
login: function (user, options) { return SatellizerLocal.login(user, options); },
signup: function (user, options) { return SatellizerLocal.signup(user, options); },
logout: function () { return SatellizerShared.logout(); },
authenticate: function (name, data) { return SatellizerOAuth.authenticate(name, data); },
link: function (name, data) { return SatellizerOAuth.authenticate(name, data); },
unlink: function (name, options) { return SatellizerOAuth.unlink(name, options); },
isAuthenticated: function (roleArg) { return SatellizerShared.isAuthenticated(roleArg); },
getPayload: function () { return SatellizerShared.getPayload(); },
getToken: function () { return SatellizerShared.getToken(); },
setToken: function (token) { return SatellizerShared.setToken({ access_token: token }); },
removeToken: function () { return SatellizerShared.removeToken(); },
setStorageType: function (type) { return SatellizerShared.setStorageType(type); }
};
};
AuthProvider.$inject = ['SatellizerConfig'];
return AuthProvider;
}());
AuthProvider.prototype.$get.$inject = ['SatellizerShared', 'SatellizerLocal', 'SatellizerOAuth'];
function joinUrl(baseUrl, url) {
if (/^(?:[a-z]+:)?\/\//i.test(url)) {
return url;
}
var joined = [baseUrl, url].join('/');
var normalize = function (str) {
return str
.replace(/[\/]+/g, '/')
.replace(/\/\?/g, '?')
.replace(/\/\#/g, '#')
.replace(/\:\//g, '://');
};
return normalize(joined);
}
function getFullUrlPath(location) {
var isHttps = location.protocol === 'https:';
return location.protocol + '//' + location.hostname +
':' + (location.port || (isHttps ? '443' : '80')) +
(/^\//.test(location.pathname) ? location.pathname : '/' + location.pathname);
}
function parseQueryString(str) {
var obj = {};
var key;
var value;
angular.forEach((str || '').split('&'), function (keyValue) {
if (keyValue) {
value = keyValue.split('=');
key = decodeURIComponent(value[0]);
obj[key] = angular.isDefined(value[1]) ? decodeURIComponent(value[1]) : true;
}
});
return obj;
}
function decodeBase64(str) {
var buffer;
if (typeof module !== 'undefined' && module.exports) {
try {
buffer = require('buffer').Buffer;
}
catch (err) {
}
}
var fromCharCode = String.fromCharCode;
var re_btou = new RegExp([
'[\xC0-\xDF][\x80-\xBF]',
'[\xE0-\xEF][\x80-\xBF]{2}',
'[\xF0-\xF7][\x80-\xBF]{3}'
].join('|'), 'g');
var cb_btou = function (cccc) {
switch (cccc.length) {
case 4:
var cp = ((0x07 & cccc.charCodeAt(0)) << 18)
| ((0x3f & cccc.charCodeAt(1)) << 12)
| ((0x3f & cccc.charCodeAt(2)) << 6)
| (0x3f & cccc.charCodeAt(3));
var offset = cp - 0x10000;
return (fromCharCode((offset >>> 10) + 0xD800)
+ fromCharCode((offset & 0x3FF) + 0xDC00));
case 3:
return fromCharCode(((0x0f & cccc.charCodeAt(0)) << 12)
| ((0x3f & cccc.charCodeAt(1)) << 6)
| (0x3f & cccc.charCodeAt(2)));
default:
return fromCharCode(((0x1f & cccc.charCodeAt(0)) << 6)
| (0x3f & cccc.charCodeAt(1)));
}
};
var btou = function (b) {
return b.replace(re_btou, cb_btou);
};
var _decode = buffer ? function (a) {
return (a.constructor === buffer.constructor
? a : new buffer(a, 'base64')).toString();
}
: function (a) {
return btou(atob(a));
};
return _decode(String(str).replace(/[-_]/g, function (m0) {
return m0 === '-' ? '+' : '/';
})
.replace(/[^A-Za-z0-9\+\/]/g, ''));
}
var Shared = (function () {
function Shared($q, $window, SatellizerConfig, SatellizerStorage) {
this.$q = $q;
this.$window = $window;
this.SatellizerConfig = SatellizerConfig;
this.SatellizerStorage = SatellizerStorage;
var _a = this.SatellizerConfig, tokenName = _a.tokenName, tokenPrefix = _a.tokenPrefix;
this.prefixedTokenName = tokenPrefix ? [tokenPrefix, tokenName].join('_') : tokenName;
}
Shared.prototype.getToken = function () {
return this.SatellizerStorage.get(this.prefixedTokenName);
};
Shared.prototype.getPayload = function () {
var token = this.SatellizerStorage.get(this.prefixedTokenName);
if (token && token.split('.').length === 3) {
try {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace('-', '+').replace('_', '/');
return JSON.parse(decodeBase64(base64));
}
catch (e) {
}
}
};
Shared.prototype.setToken = function (response) {
var tokenRoot = this.SatellizerConfig.tokenRoot;
var tokenName = this.SatellizerConfig.tokenName;
var accessToken = response && response.access_token;
var token;
if (accessToken) {
if (angular.isObject(accessToken) && angular.isObject(accessToken.data)) {
response = accessToken;
}
else if (angular.isString(accessToken)) {
token = accessToken;
}
}
if (!token && response) {
var tokenRootData = tokenRoot && tokenRoot.split('.').reduce(function (o, x) { return o[x]; }, response.data);
token = tokenRootData ? tokenRootData[tokenName] : response.data && response.data[tokenName];
}
if (token) {
this.SatellizerStorage.set(this.prefixedTokenName, token);
}
};
Shared.prototype.removeToken = function () {
this.SatellizerStorage.remove(this.prefixedTokenName);
};
Shared.prototype.isAuthenticated = function (roleArg) {
var token = this.SatellizerStorage.get(this.prefixedTokenName);
if (token) {
if (token.split('.').length === 3) {
try {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace('-', '+').replace('_', '/');
var exp = JSON.parse(this.$window.atob(base64)).exp;
var role = JSON.parse(this.$window.atob(base64)).role;
if (typeof exp === 'number') {
return Math.round(new Date().getTime() / 1000) < exp;
}
if (roleArgument) {
if (roleArgument !== role) {
return false; // Fail: Supplied role doesn't match role defined in token
}
}
}
catch (e) {
return true; // Pass: Non-JWT token that looks like JWT
}
}
return true; // Pass: All other tokens
}
return false; // Fail: No token at all
};
Shared.prototype.logout = function () {
this.SatellizerStorage.remove(this.prefixedTokenName);
return this.$q.when();
};
Shared.prototype.setStorageType = function (type) {
this.SatellizerConfig.storageType = type;
};
Shared.$inject = ['$q', '$window', 'SatellizerConfig', 'SatellizerStorage'];
return Shared;
}());
var Local = (function () {
function Local($http, SatellizerConfig, SatellizerShared) {
this.$http = $http;
this.SatellizerConfig = SatellizerConfig;
this.SatellizerShared = SatellizerShared;
}
Local.prototype.login = function (user, options) {
var _this = this;
if (options === void 0) { options = {}; }
options.url = options.url ? options.url : joinUrl(this.SatellizerConfig.baseUrl, this.SatellizerConfig.loginUrl);
options.data = user || options.data;
options.method = options.method || 'POST';
options.withCredentials = options.withCredentials || this.SatellizerConfig.withCredentials;
return this.$http(options).then(function (response) {
_this.SatellizerShared.setToken(response);
return response;
});
};
Local.prototype.signup = function (user, options) {
if (options === void 0) { options = {}; }
options.url = options.url ? options.url : joinUrl(this.SatellizerConfig.baseUrl, this.SatellizerConfig.signupUrl);
options.data = user || options.data;
options.method = options.method || 'POST';
options.withCredentials = options.withCredentials || this.SatellizerConfig.withCredentials;
return this.$http(options);
};
Local.$inject = ['$http', 'SatellizerConfig', 'SatellizerShared'];
return Local;
}());
var Popup = (function () {
function Popup($interval, $window, $q) {
this.$interval = $interval;
this.$window = $window;
this.$q = $q;
this.popup = null;
this.defaults = {
redirectUri: null
};
}
Popup.prototype.stringifyOptions = function (options) {
var parts = [];
angular.forEach(options, function (value, key) {
parts.push(key + '=' + value);
});
return parts.join(',');
};
Popup.prototype.open = function (url, name, popupOptions, redirectUri, dontPoll) {
var width = popupOptions.width || 500;
var height = popupOptions.height || 500;
var options = this.stringifyOptions({
width: width,
height: height,
top: this.$window.screenY + ((this.$window.outerHeight - height) / 2.5),
left: this.$window.screenX + ((this.$window.outerWidth - width) / 2)
});
var popupName = this.$window['cordova'] || this.$window.navigator.userAgent.indexOf('CriOS') > -1 ? '_blank' : name;
this.popup = this.$window.open(url, popupName, options);
if (this.popup && this.popup.focus) {
this.popup.focus();
}
if (dontPoll) {
return;
}
if (this.$window['cordova']) {
return this.eventListener(redirectUri);
}
else {
if (url === 'about:blank') {
this.popup.location = url;
}
return this.polling(redirectUri);
}
};
Popup.prototype.polling = function (redirectUri) {
var _this = this;
return this.$q(function (resolve, reject) {
var redirectUriParser = document.createElement('a');
redirectUriParser.href = redirectUri;
var redirectUriPath = getFullUrlPath(redirectUriParser);
var polling = _this.$interval(function () {
if (!_this.popup || _this.popup.closed || _this.popup.closed === undefined) {
_this.$interval.cancel(polling);
reject(new Error('The popup window was closed'));
}
try {
var popupWindowPath = getFullUrlPath(_this.popup.location);
if (popupWindowPath === redirectUriPath) {
if (_this.popup.location.search || _this.popup.location.hash) {
var query = parseQueryString(_this.popup.location.search.substring(1).replace(/\/$/, ''));
var hash = parseQueryString(_this.popup.location.hash.substring(1).replace(/[\/$]/, ''));
var params = angular.extend({}, query, hash);
if (params.error) {
reject(new Error(params.error));
}
else {
resolve(params);
}
}
else {
reject(new Error('OAuth redirect has occurred but no query or hash parameters were found. ' +
'They were either not set during the redirect, or were removed—typically by a ' +
'routing library—before Satellizer could read it.'));
}
_this.$interval.cancel(polling);
_this.popup.close();
}
}
catch (error) {
}
}, 500);
});
};
Popup.prototype.eventListener = function (redirectUri) {
var _this = this;
return this.$q(function (resolve, reject) {
_this.popup.addEventListener('loadstart', function (event) {
if (event.url.indexOf(redirectUri) !== 0) {
return;
}
var parser = document.createElement('a');
parser.href = event.url;
if (parser.search || parser.hash) {
var query = parseQueryString(parser.search.substring(1).replace(/\/$/, ''));
var hash = parseQueryString(parser.hash.substring(1).replace(/[\/$]/, ''));
var params = angular.extend({}, query, hash);
if (params.error) {
reject(new Error(params.error));
}
else {
resolve(params);
}
_this.popup.close();
}
});
_this.popup.addEventListener('loaderror', function () {
reject(new Error('Authorization failed'));
});
_this.popup.addEventListener('exit', function () {
reject(new Error('The popup window was closed'));
});
});
};
Popup.$inject = ['$interval', '$window', '$q'];
return Popup;
}());
var OAuth1 = (function () {
function OAuth1($http, $window, SatellizerConfig, SatellizerPopup) {
this.$http = $http;
this.$window = $window;
this.SatellizerConfig = SatellizerConfig;
this.SatellizerPopup = SatellizerPopup;
this.defaults = {
name: null,
url: null,
authorizationEndpoint: null,
scope: null,
scopePrefix: null,
scopeDelimiter: null,
redirectUri: null,
requiredUrlParams: null,
defaultUrlParams: null,
oauthType: '1.0',
popupOptions: { width: null, height: null }
};
}
;
OAuth1.prototype.init = function (options, userData) {
var _this = this;
angular.extend(this.defaults, options);
var name = options.name, popupOptions = options.popupOptions;
var redirectUri = this.defaults.redirectUri;
// Should open an empty popup and wait until request token is received
if (!this.$window['cordova']) {
this.SatellizerPopup.open('about:blank', name, popupOptions, redirectUri, true);
}
return this.getRequestToken().then(function (response) {
return _this.openPopup(options, response).then(function (popupResponse) {
return _this.exchangeForToken(popupResponse, userData);
});
});
};
OAuth1.prototype.openPopup = function (options, response) {
var url = [options.authorizationEndpoint, this.buildQueryString(response.data)].join('?');
var redirectUri = this.defaults.redirectUri;
if (this.$window['cordova']) {
return this.SatellizerPopup.open(url, options.name, options.popupOptions, redirectUri);
}
else {
this.SatellizerPopup.popup.location = url;
return this.SatellizerPopup.polling(redirectUri);
}
};
OAuth1.prototype.getRequestToken = function () {
var url = this.SatellizerConfig.baseUrl ? joinUrl(this.SatellizerConfig.baseUrl, this.defaults.url) : this.defaults.url;
return this.$http.post(url, this.defaults);
};
OAuth1.prototype.exchangeForToken = function (oauthData, userData) {
var payload = angular.extend({}, userData, oauthData);
var exchangeForTokenUrl = this.SatellizerConfig.baseUrl ? joinUrl(this.SatellizerConfig.baseUrl, this.defaults.url) : this.defaults.url;
return this.$http.post(exchangeForTokenUrl, payload, { withCredentials: this.SatellizerConfig.withCredentials });
};
OAuth1.prototype.buildQueryString = function (obj) {
var str = [];
angular.forEach(obj, function (value, key) {
str.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
});
return str.join('&');
};
OAuth1.$inject = ['$http', '$window', 'SatellizerConfig', 'SatellizerPopup'];
return OAuth1;
}());
var OAuth2 = (function () {
function OAuth2($http, $window, $timeout, $q, SatellizerConfig, SatellizerPopup, SatellizerStorage) {
this.$http = $http;
this.$window = $window;
this.$timeout = $timeout;
this.$q = $q;
this.SatellizerConfig = SatellizerConfig;
this.SatellizerPopup = SatellizerPopup;
this.SatellizerStorage = SatellizerStorage;
this.defaults = {
name: null,
url: null,
clientId: null,
authorizationEndpoint: null,
redirectUri: null,
scope: null,
scopePrefix: null,
scopeDelimiter: null,
state: null,
requiredUrlParams: null,
defaultUrlParams: ['response_type', 'client_id', 'redirect_uri'],
responseType: 'code',
responseParams: {
code: 'code',
clientId: 'clientId',
redirectUri: 'redirectUri'
},
oauthType: '2.0',
popupOptions: { width: null, height: null }
};
}
OAuth2.camelCase = function (name) {
return name.replace(/([\:\-\_]+(.))/g, function (_, separator, letter, offset) {
return offset ? letter.toUpperCase() : letter;
});
};
OAuth2.prototype.init = function (options, userData) {
var _this = this;
return this.$q(function (resolve, reject) {
angular.extend(_this.defaults, options);
var stateName = _this.defaults.name + '_state';
var _a = _this.defaults, name = _a.name, state = _a.state, popupOptions = _a.popupOptions, redirectUri = _a.redirectUri, responseType = _a.responseType;
if (typeof state === 'function') {
_this.SatellizerStorage.set(stateName, state());
}
else if (typeof state === 'string') {
_this.SatellizerStorage.set(stateName, state);
}
var url = [_this.defaults.authorizationEndpoint, _this.buildQueryString()].join('?');
_this.SatellizerPopup.open(url, name, popupOptions, redirectUri).then(function (oauth) {
if (responseType === 'token' || !url) {
return resolve(oauth);
}
if (oauth.state && oauth.state !== _this.SatellizerStorage.get(stateName)) {
return reject(new Error('The value returned in the state parameter does not match the state value from your original ' +
'authorization code request.'));
}
resolve(_this.exchangeForToken(oauth, userData));
}).catch(function (error) { return reject(error); });
});
};
OAuth2.prototype.exchangeForToken = function (oauthData, userData) {
var _this = this;
var payload = angular.extend({}, userData);
angular.forEach(this.defaults.responseParams, function (value, key) {
switch (key) {
case 'code':
payload[value] = oauthData.code;
break;
case 'clientId':
payload[value] = _this.defaults.clientId;
break;
case 'redirectUri':
payload[value] = _this.defaults.redirectUri;
break;
default:
payload[value] = oauthData[key];
}
});
if (oauthData.state) {
payload.state = oauthData.state;
}
var exchangeForTokenUrl = this.SatellizerConfig.baseUrl ?
joinUrl(this.SatellizerConfig.baseUrl, this.defaults.url) :
this.defaults.url;
return this.$http.post(exchangeForTokenUrl, payload, { withCredentials: this.SatellizerConfig.withCredentials });
};
OAuth2.prototype.buildQueryString = function () {
var _this = this;
var keyValuePairs = [];
var urlParamsCategories = ['defaultUrlParams', 'requiredUrlParams', 'optionalUrlParams'];
angular.forEach(urlParamsCategories, function (paramsCategory) {
angular.forEach(_this.defaults[paramsCategory], function (paramName) {
var camelizedName = OAuth2.camelCase(paramName);
var paramValue = angular.isFunction(_this.defaults[paramName]) ? _this.defaults[paramName]() : _this.defaults[camelizedName];
if (paramName === 'redirect_uri' && !paramValue) {
return;
}
if (paramName === 'state') {
var stateName = _this.defaults.name + '_state';
paramValue = encodeURIComponent(_this.SatellizerStorage.get(stateName));
}
if (paramName === 'scope' && Array.isArray(paramValue)) {
paramValue = paramValue.join(_this.defaults.scopeDelimiter);
if (_this.defaults.scopePrefix) {
paramValue = [_this.defaults.scopePrefix, paramValue].join(_this.defaults.scopeDelimiter);
}
}
keyValuePairs.push([paramName, paramValue]);
});
});
return keyValuePairs.map(function (pair) { return pair.join('='); }).join('&');
};
OAuth2.$inject = ['$http', '$window', '$timeout', '$q', 'SatellizerConfig', 'SatellizerPopup', 'SatellizerStorage'];
return OAuth2;
}());
var OAuth = (function () {
function OAuth($http, $window, $timeout, $q, SatellizerConfig, SatellizerPopup, SatellizerStorage, SatellizerShared, SatellizerOAuth1, SatellizerOAuth2) {
this.$http = $http;
this.$window = $window;
this.$timeout = $timeout;
this.$q = $q;
this.SatellizerConfig = SatellizerConfig;
this.SatellizerPopup = SatellizerPopup;
this.SatellizerStorage = SatellizerStorage;
this.SatellizerShared = SatellizerShared;
this.SatellizerOAuth1 = SatellizerOAuth1;
this.SatellizerOAuth2 = SatellizerOAuth2;
}
OAuth.prototype.authenticate = function (name, userData) {
var _this = this;
return this.$q(function (resolve, reject) {
var provider = _this.SatellizerConfig.providers[name];
var oauth = null;
switch (provider.oauthType) {
case '1.0':
oauth = new OAuth1(_this.$http, _this.$window, _this.SatellizerConfig, _this.SatellizerPopup);
break;
case '2.0':
oauth = new OAuth2(_this.$http, _this.$window, _this.$timeout, _this.$q, _this.SatellizerConfig, _this.SatellizerPopup, _this.SatellizerStorage);
break;
default:
return reject(new Error('Invalid OAuth Type'));
}
return oauth.init(provider, userData).then(function (response) {
if (provider.url) {
_this.SatellizerShared.setToken(response);
}
resolve(response);
}).catch(function (error) {
reject(error);
});
});
};
OAuth.prototype.unlink = function (provider, httpOptions) {
if (httpOptions === void 0) { httpOptions = {}; }
httpOptions.url = httpOptions.url ? httpOptions.url : joinUrl(this.SatellizerConfig.baseUrl, this.SatellizerConfig.unlinkUrl);
httpOptions.data = { provider: provider } || httpOptions.data;
httpOptions.method = httpOptions.method || 'POST';
httpOptions.withCredentials = httpOptions.withCredentials || this.SatellizerConfig.withCredentials;
return this.$http(httpOptions);
};
OAuth.$inject = [
'$http',
'$window',
'$timeout',
'$q',
'SatellizerConfig',
'SatellizerPopup',
'SatellizerStorage',
'SatellizerShared',
'SatellizerOAuth1',
'SatellizerOAuth2'
];
return OAuth;
}());
var Storage = (function () {
function Storage($window, SatellizerConfig) {
this.$window = $window;
this.SatellizerConfig = SatellizerConfig;
this.memoryStore = {};
}
Storage.prototype.get = function (key) {
try {
return this.$window[this.SatellizerConfig.storageType].getItem(key);
}
catch (e) {
return this.memoryStore[key];
}
};
Storage.prototype.set = function (key, value) {
try {
this.$window[this.SatellizerConfig.storageType].setItem(key, value);
}
catch (e) {
this.memoryStore[key] = value;
}
};
Storage.prototype.remove = function (key) {
try {
this.$window[this.SatellizerConfig.storageType].removeItem(key);
}
catch (e) {
delete this.memoryStore[key];
}
};
Storage.$inject = ['$window', 'SatellizerConfig'];
return Storage;
}());
var Interceptor = (function () {
function Interceptor(SatellizerConfig, SatellizerShared, SatellizerStorage) {
var _this = this;
this.SatellizerConfig = SatellizerConfig;
this.SatellizerShared = SatellizerShared;
this.SatellizerStorage = SatellizerStorage;
this.request = function (config) {
if (config['skipAuthorization']) {
return config;
}
if (_this.SatellizerShared.isAuthenticated() && _this.SatellizerConfig.httpInterceptor()) {
var tokenName = _this.SatellizerConfig.tokenPrefix ?
[_this.SatellizerConfig.tokenPrefix, _this.SatellizerConfig.tokenName].join('_') : _this.SatellizerConfig.tokenName;
var token = _this.SatellizerStorage.get(tokenName);
if (_this.SatellizerConfig.tokenHeader && _this.SatellizerConfig.tokenType) {
token = _this.SatellizerConfig.tokenType + ' ' + token;
}
config.headers[_this.SatellizerConfig.tokenHeader] = token;
}
return config;
};
}
Interceptor.Factory = function (SatellizerConfig, SatellizerShared, SatellizerStorage) {
return new Interceptor(SatellizerConfig, SatellizerShared, SatellizerStorage);
};
Interceptor.$inject = ['SatellizerConfig', 'SatellizerShared', 'SatellizerStorage'];
return Interceptor;
}());
Interceptor.Factory.$inject = ['SatellizerConfig', 'SatellizerShared', 'SatellizerStorage'];
var HttpProviderConfig = (function () {
function HttpProviderConfig($httpProvider) {
this.$httpProvider = $httpProvider;
$httpProvider.interceptors.push(Interceptor.Factory);
}
HttpProviderConfig.$inject = ['$httpProvider'];
return HttpProviderConfig;
}());
angular.module('satellizer', [])
.provider('$auth', ['SatellizerConfig', function (SatellizerConfig) { return new AuthProvider(SatellizerConfig); }])
.constant('SatellizerConfig', Config.getConstant)
.service('SatellizerShared', Shared)
.service('SatellizerLocal', Local)
.service('SatellizerPopup', Popup)
.service('SatellizerOAuth', OAuth)
.service('SatellizerOAuth2', OAuth2)
.service('SatellizerOAuth1', OAuth1)
.service('SatellizerStorage', Storage)
.service('SatellizerInterceptor', Interceptor)
.config(['$httpProvider', function ($httpProvider) { return new HttpProviderConfig($httpProvider); }]);
var ng1 = 'satellizer';
return ng1;
}));
//# sourceMappingURL=satellizer.js.map
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment