walnut_launchpad.html/js/services/auth-service.js

140 lines
4.0 KiB
JavaScript

app.factory('Auth', [
'$rootScope', 'localStorageService', '$location', 'azp@oauth3.org'
, function($rootScope, localStorageService, $location, Oauth3) {
var dapSession = 'dap-session';
var dapSessions = 'dap-sessions';
var Auth = {
isLoggedIn: function () {
Auth.restore();
return Auth.session || false;
},
getProfile: function (profile) {
Auth.restore();
return Auth.session || false;
},
getActiveSessions: function () {
Auth.restore();
return Auth.sessions || false;
}
, add: function (session) {
var obj = JSON.parse(localStorage.getItem(dapSessions) || 'null') || {};
var dapName = 'dap-' + session.subject + '|' + session.issuer;
/*
Object.keys(Auth.session).forEach(function (key) {
delete Auth.session[key];
});
Object.keys(session).forEach(function (key) {
Auth.session[key] = session[key];
});
*/
Auth.session = session;
Auth.sessions.push(session);
localStorage.setItem(dapName, JSON.stringify(session));
localStorage.setItem(dapSession, dapName);
obj[dapName] = Date.now();
localStorage.setItem(dapSessions, JSON.stringify(obj));
}
, restore: function () {
var dapName = localStorage.getItem(dapSession);
Auth.sessions.length = 0; // don't overwrite with a new array, keep original references
(Object.keys(JSON.parse(localStorage.getItem(dapSessions) || 'null') || {})).forEach(function (name) {
var session = JSON.parse(localStorage.getItem(name) || 'null');
if (session) {
session.email = session.subject;
}
if (!session.issuer) {
console.error(session);
throw new Error('restored session without audience');
}
if (dapName === name) {
Auth.session = session;
}
Auth.sessions.push(session);
});
if (Auth.session) {
Auth.select(Auth.session);
}
return Auth.session;
}
, get: function (session) {
if (!session) {
return $q.resolve(null);
}
if (!session.issuer) {
throw new Error("session doesn't have an issuer");
}
var name = session.token.sub + '@' + session.token.iss;
var promise;
var sess;
if (!Auth._oauth3s[name]) {
sess = Oauth3.create(window.location);
promise = Auth._oauth3s[name] = sess.init({
location: location
, issuer: session.issuer
, audience: session.audience || session.issuer
, session: session
}).then(function () {
return sess;
});
} else {
promise = Oauth3.PromiseA.resolve(Auth._oauth3s[name]);
}
return promise;
}
, select: function (session) {
return Auth.get(session).then(function (oauth3) {
var dapName = 'dap-' + session.subject + '|' + session.issuer;
localStorage.setItem(dapSession, dapName);
Auth.session = session;
Auth.oauth3 = oauth3;
});
}
, signOut: function () {
var session = Auth.session;
var dapName = 'dap-' + session.subject + '|' + session.issuer;
// TODO logout url should be created upon login and remain fixed throughout the duration of the session (or on session restoration)
return Auth.oauth3.logout().then(function () {
var obj = JSON.parse(localStorage.getItem(dapSessions) || '{}');
delete obj[dapName];
var newDapName = Object.keys(obj).sort(function (a, b) { return obj[a] - obj[b]; })[0];
localStorage.setItem(dapSession, newDapName);
localStorage.setItem(dapSessions, JSON.stringify(obj));
localStorage.removeItem(dapName);
if (!newDapName) {
localStorage.removeItem(dapSession);
}
return Auth.restore();
});
// localStorage.clear();
}
, _oauth3s: {}
, sessions: []
, session: null
, oauth3: null
};
Auth.oauth3 = Oauth3.create(window.location);
return Auth;
}]);