Last active
July 23, 2017 12:22
-
-
Save gognjanovski/b73d81dea896ea3c396d9e74e31711ca to your computer and use it in GitHub Desktop.
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
(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