Skip to content

Instantly share code, notes, and snippets.

@gognjanovski
Last active July 23, 2017 12:22
Show Gist options
  • Save gognjanovski/b73d81dea896ea3c396d9e74e31711ca to your computer and use it in GitHub Desktop.
Save gognjanovski/b73d81dea896ea3c396d9e74e31711ca to your computer and use it in GitHub Desktop.
(function () {
'use strict';
angular.module('token.service')
.factory('AuthorizationTokenService', AuthorizationTokenService);
AuthorizationTokenService.$inject = ['$q', '$injector'];
function AuthorizationTokenService($q, $injector) {
//Local storage for token
var tokenVM = {
accessToken: null,
expiresAt: null
};
//Subscribed listeners which will get notified when new Access Token is available
var subscribers = [];
//Promise for getting new Access Token from backend
var deferedRefreshAccessToken = null;
var service = {
getLocalAccessToken: getLocalAccessToken,
refreshAccessToken: refreshAccessToken,
isAccessTokenExpired: isAccessTokenExpired,
subscribe: subscribe
};
return service;
////////////////////////////////////
//Get the new Access Token from backend
function refreshAccessToken() {
//If already waiting for the Promise, return it.
if(deferedRefreshAccessToken) {
return deferedRefreshAccessToken.promise
}
else {
deferedRefreshAccessToken = $q.defer();
//Get $http service with $injector to avoid circular dependency
var http = $injector.get('$http');
http({
method: "GET",
url: "/Home/getNewAccessToken"
})
.then(function mySucces(response) {
var data = response.data;
if(data){
//Save new Access Token
if(saveToken(data.AccessToken, data.ExpiresAt)) {
//Resolve Promise
deferedRefreshAccessToken.resolve(data.AccessToken);
//Notify all subscribers
notifySubscribersNewAccessToken(data.AccessToken);
deferedRefreshAccessToken = null;
}
}
}, function myError(error) {
deferedRefreshAccessToken.reject(error);
deferedRefreshAccessToken = null;
});
return deferedRefreshAccessToken.promise;
}
}
function getLocalAccessToken() {
//...
//get accesstoken from storage
}
function isAccessTokenExpired() {
//...
//Check if expiresAt is older then current Date
}
function saveToken(accessToken, expiresAt) {
//...
//Save token to storage (in html view, local storage etc.)
}
//This function will call all listeners (callbacks) and notify them that new access token is available
//This is used to notify the web socket that new access token is available
function notifySubscribersNewAccessToken(accessToken) {
angular.forEach(subscribers, function(subscriber) {
subscriber(accessToken);
});
}
//Subscribe to this service. Be notifyed when access token is renewed
function subscribe(callback) {
subscribers.push(callback);
}
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment