diff --git a/README.md b/README.md index 818e183..7559c58 100644 --- a/README.md +++ b/README.md @@ -154,8 +154,9 @@ Configuration defaults: ```js OAuthTokenProvider.configure({ name: 'token', + storage:'cookies', // options: 'cookies', 'localstorage', 'sessionstorage' options: { - secure: true + secure: true // optional, is valid if you're using cookies storage } }); ``` diff --git a/bower.json b/bower.json index 379a19e..07c6868 100644 --- a/bower.json +++ b/bower.json @@ -24,7 +24,8 @@ ], "dependencies": { "angular": "^1.4.0", - "angular-cookies": "^1.4.0", + "angular-cookies": "~1.4.6", + "ngstorage": "^0.3.9", "query-string": "^1.0.0" } } diff --git a/dist/angular-oauth2.js b/dist/angular-oauth2.js index 6152c8c..1da5dff 100644 --- a/dist/angular-oauth2.js +++ b/dist/angular-oauth2.js @@ -13,11 +13,33 @@ root.angularOAuth2 = factory(root.angular, root.queryString); } })(this, function(angular, queryString) { - var ngModule = angular.module("angular-oauth2", [ "ngCookies" ]).config(oauthConfig).factory("oauthInterceptor", oauthInterceptor).provider("OAuth", OAuthProvider).provider("OAuthToken", OAuthTokenProvider); + var ngModule = angular.module("angular-oauth2", [ "ngCookies", "ngStorage" ]).config(oauthConfig).factory("oauthInterceptor", oauthInterceptor).provider("OAuth", OAuthProvider).provider("OAuthToken", OAuthTokenProvider).provider("OAuthStorage", OAuthStorageProvider); function oauthConfig($httpProvider) { $httpProvider.interceptors.push("oauthInterceptor"); } oauthConfig.$inject = [ "$httpProvider" ]; + function oauthInterceptor($q, $rootScope, OAuthToken) { + return { + request: function(config) { + if (OAuthToken.getAuthorizationHeader()) { + config.headers = config.headers || {}; + config.headers.Authorization = OAuthToken.getAuthorizationHeader(); + } + return config; + }, + responseError: function(rejection) { + if (400 === rejection.status && rejection.data && ("invalid_request" === rejection.data.error || "invalid_grant" === rejection.data.error)) { + OAuthToken.removeToken(); + $rootScope.$emit("oauth:error", rejection); + } + if (401 === rejection.status && (rejection.data && "invalid_token" === rejection.data.error) || rejection.headers("www-authenticate") && 0 === rejection.headers("www-authenticate").indexOf("Bearer")) { + $rootScope.$emit("oauth:error", rejection); + } + return $q.reject(rejection); + } + }; + } + oauthInterceptor.$inject = [ "$q", "$rootScope", "OAuthToken" ]; var _prototypeProperties = function(child, staticProps, instanceProps) { if (staticProps) Object.defineProperties(child, staticProps); if (instanceProps) Object.defineProperties(child.prototype, instanceProps); @@ -156,9 +178,10 @@ if (staticProps) Object.defineProperties(child, staticProps); if (instanceProps) Object.defineProperties(child.prototype, instanceProps); }; - function OAuthTokenProvider() { + function OAuthTokenProvider($injector) { var config = { name: "token", + storage: "cookies", options: { secure: true } @@ -168,15 +191,18 @@ throw new TypeError("Invalid argument: `config` must be an `Object`."); } angular.extend(config, params); + $injector.invoke(function(OAuthStorageProvider) { + OAuthStorageProvider.configure(config); + }); return config; }; - this.$get = function($cookies) { + this.$get = function(OAuthStorage) { var OAuthToken = function() { function OAuthToken() {} _prototypeProperties(OAuthToken, null, { setToken: { value: function setToken(data) { - return $cookies.putObject(config.name, data, config.options); + return OAuthStorage.setToken(data); }, writable: true, enumerable: true, @@ -184,7 +210,7 @@ }, getToken: { value: function getToken() { - return $cookies.getObject(config.name); + return OAuthStorage.getToken(); }, writable: true, enumerable: true, @@ -227,7 +253,7 @@ }, removeToken: { value: function removeToken() { - return $cookies.remove(config.name, config.options); + return OAuthStorage.deleteToken(); }, writable: true, enumerable: true, @@ -238,29 +264,140 @@ }(); return new OAuthToken(); }; - this.$get.$inject = [ "$cookies" ]; + this.$get.$inject = [ "OAuthStorage" ]; } - function oauthInterceptor($q, $rootScope, OAuthToken) { - return { - request: function(config) { - if (OAuthToken.getAuthorizationHeader()) { - config.headers = config.headers || {}; - config.headers.Authorization = OAuthToken.getAuthorizationHeader(); + var _prototypeProperties = function(child, staticProps, instanceProps) { + if (staticProps) Object.defineProperties(child, staticProps); + if (instanceProps) Object.defineProperties(child.prototype, instanceProps); + }; + function OAuthStorageProvider() { + var config = { + name: "token", + storage: "cookies", + options: { + secure: true + } + }; + this.configure = function(params) { + angular.extend(config, params); + return config; + }; + this.$get = function($localStorage, $sessionStorage, $cookies, $log) { + var storage; + var ngStorage = config.storage.toLowerCase(); + if (ngStorage === "localstorage") { + storage = $localStorage; + } else if (ngStorage === "sessionstorage") { + storage = $sessionStorage; + } else if (ngStorage === "cookies") { + storage = $cookies; + } else { + storage = $cookies; + $log.warn("Set storage to cookies, because storage type is unknown"); + } + var BrowserStorage = function() { + function BrowserStorage(storage, name) { + this.storage = storage; + this.name = name; } - return config; - }, - responseError: function(rejection) { - if (400 === rejection.status && rejection.data && ("invalid_request" === rejection.data.error || "invalid_grant" === rejection.data.error)) { - OAuthToken.removeToken(); - $rootScope.$emit("oauth:error", rejection); + _prototypeProperties(BrowserStorage, null, { + setToken: { + value: function setToken(data) { + return this.storage[this.name] = angular.toJson(data); + }, + writable: true, + enumerable: true, + configurable: true + }, + getToken: { + value: function getToken() { + return angular.fromJson(this.storage[this.name]); + }, + writable: true, + enumerable: true, + configurable: true + }, + deleteToken: { + value: function deleteToken() { + delete this.storage[this.name]; + }, + writable: true, + enumerable: true, + configurable: true + } + }); + return BrowserStorage; + }(); + var CookieStorage = function() { + function CookieStorage($cookies, name, options) { + this.$cookies = $cookies; + this.name = name; + this.options = options; } - if (401 === rejection.status && (rejection.data && "invalid_token" === rejection.data.error) || rejection.headers("www-authenticate") && 0 === rejection.headers("www-authenticate").indexOf("Bearer")) { - $rootScope.$emit("oauth:error", rejection); + _prototypeProperties(CookieStorage, null, { + setToken: { + value: function setToken(value) { + return this.$cookies.putObject(this.name, value, this.options); + }, + writable: true, + enumerable: true, + configurable: true + }, + getToken: { + value: function getToken() { + return this.$cookies.getObject(this.name); + }, + writable: true, + enumerable: true, + configurable: true + }, + deleteToken: { + value: function deleteToken() { + return this.$cookies.remove(this.name, this.options); + }, + writable: true, + enumerable: true, + configurable: true + } + }); + return CookieStorage; + }(); + var OAuthStorage = function() { + function OAuthStorage(storage) { + this.storage = storage; } - return $q.reject(rejection); - } + _prototypeProperties(OAuthStorage, null, { + setToken: { + value: function setToken(value) { + return this.storage.setToken(value); + }, + writable: true, + enumerable: true, + configurable: true + }, + getToken: { + value: function getToken() { + return this.storage.getToken(); + }, + writable: true, + enumerable: true, + configurable: true + }, + deleteToken: { + value: function deleteToken() { + return this.storage.deleteToken(); + }, + writable: true, + enumerable: true, + configurable: true + } + }); + return OAuthStorage; + }(); + storage = ngStorage === "cookies" ? new CookieStorage(storage, config.name, config.options) : new BrowserStorage(storage, config.name); + return new OAuthStorage(storage); }; + this.$get.$inject = [ "$localStorage", "$sessionStorage", "$cookies", "$log" ]; } - oauthInterceptor.$inject = [ "$q", "$rootScope", "OAuthToken" ]; return ngModule; }); \ No newline at end of file diff --git a/dist/angular-oauth2.min.js b/dist/angular-oauth2.min.js index 4260312..7484934 100644 --- a/dist/angular-oauth2.min.js +++ b/dist/angular-oauth2.min.js @@ -1 +1 @@ -!function(e,t){"function"==typeof define&&define.amd?define(["angular","query-string"],t):"object"==typeof exports?module.exports=t(require("angular"),require("query-string")):e.angularOAuth2=t(e.angular,e.queryString)}(this,function(e,t){function r(e){e.interceptors.push("oauthInterceptor")}function n(){var r;this.configure=function(t){if(r)throw new Error("Already configured.");if(!(t instanceof Object))throw new TypeError("Invalid argument: `config` must be an `Object`.");return r=e.extend({},c,t),e.forEach(s,function(e){if(!r[e])throw new Error("Missing parameter: "+e+".")}),"/"===r.baseUrl.substr(-1)&&(r.baseUrl=r.baseUrl.slice(0,-1)),"/"!==r.grantPath[0]&&(r.grantPath="/"+r.grantPath),"/"!==r.revokePath[0]&&(r.revokePath="/"+r.revokePath),r},this.$get=function(n,o){var a=function(){function a(){if(!r)throw new Error("`OAuthProvider` must be configured first.")}return u(a,null,{isAuthenticated:{value:function(){return!!o.getToken()},writable:!0,enumerable:!0,configurable:!0},getAccessToken:{value:function(a,i){if(!a||!a.username||!a.password)throw new Error("`user` must be an object with `username` and `password` properties.");var u={client_id:r.clientId,grant_type:"password",username:a.username,password:a.password};return null!==r.clientSecret&&(u.client_secret=r.clientSecret),u=t.stringify(u),i=e.extend({headers:{"Content-Type":"application/x-www-form-urlencoded"}},i),n.post(""+r.baseUrl+r.grantPath,u,i).then(function(e){return o.setToken(e.data),e})},writable:!0,enumerable:!0,configurable:!0},getRefreshToken:{value:function(){var e={client_id:r.clientId,grant_type:"refresh_token",refresh_token:o.getRefreshToken()};null!==r.clientSecret&&(e.client_secret=r.clientSecret),e=t.stringify(e);var a={headers:{"Content-Type":"application/x-www-form-urlencoded"}};return n.post(""+r.baseUrl+r.grantPath,e,a).then(function(e){return o.setToken(e.data),e})},writable:!0,enumerable:!0,configurable:!0},revokeToken:{value:function(){var e=t.stringify({token:o.getRefreshToken()?o.getRefreshToken():o.getAccessToken()}),a={headers:{"Content-Type":"application/x-www-form-urlencoded"}};return n.post(""+r.baseUrl+r.revokePath,e,a).then(function(e){return o.removeToken(),e})},writable:!0,enumerable:!0,configurable:!0}}),a}();return new a},this.$get.$inject=["$http","OAuthToken"]}function o(){var t={name:"token",options:{secure:!0}};this.configure=function(r){if(!(r instanceof Object))throw new TypeError("Invalid argument: `config` must be an `Object`.");return e.extend(t,r),t},this.$get=function(e){var r=function(){function r(){}return u(r,null,{setToken:{value:function(r){return e.putObject(t.name,r,t.options)},writable:!0,enumerable:!0,configurable:!0},getToken:{value:function(){return e.getObject(t.name)},writable:!0,enumerable:!0,configurable:!0},getAccessToken:{value:function(){return this.getToken()?this.getToken().access_token:void 0},writable:!0,enumerable:!0,configurable:!0},getAuthorizationHeader:{value:function(){return this.getTokenType()&&this.getAccessToken()?""+(this.getTokenType().charAt(0).toUpperCase()+this.getTokenType().substr(1))+" "+this.getAccessToken():void 0},writable:!0,enumerable:!0,configurable:!0},getRefreshToken:{value:function(){return this.getToken()?this.getToken().refresh_token:void 0},writable:!0,enumerable:!0,configurable:!0},getTokenType:{value:function(){return this.getToken()?this.getToken().token_type:void 0},writable:!0,enumerable:!0,configurable:!0},removeToken:{value:function(){return e.remove(t.name,t.options)},writable:!0,enumerable:!0,configurable:!0}}),r}();return new r},this.$get.$inject=["$cookies"]}function a(e,t,r){return{request:function(e){return r.getAuthorizationHeader()&&(e.headers=e.headers||{},e.headers.Authorization=r.getAuthorizationHeader()),e},responseError:function(n){return 400!==n.status||!n.data||"invalid_request"!==n.data.error&&"invalid_grant"!==n.data.error||(r.removeToken(),t.$emit("oauth:error",n)),(401===n.status&&n.data&&"invalid_token"===n.data.error||n.headers("www-authenticate")&&0===n.headers("www-authenticate").indexOf("Bearer"))&&t.$emit("oauth:error",n),e.reject(n)}}}var i=e.module("angular-oauth2",["ngCookies"]).config(r).factory("oauthInterceptor",a).provider("OAuth",n).provider("OAuthToken",o);r.$inject=["$httpProvider"];var u=function(e,t,r){t&&Object.defineProperties(e,t),r&&Object.defineProperties(e.prototype,r)},c={baseUrl:null,clientId:null,clientSecret:null,grantPath:"/oauth2/token",revokePath:"/oauth2/revoke"},s=["baseUrl","clientId","grantPath","revokePath"],u=function(e,t,r){t&&Object.defineProperties(e,t),r&&Object.defineProperties(e.prototype,r)};return a.$inject=["$q","$rootScope","OAuthToken"],i}); \ No newline at end of file +!function(e,t){"function"==typeof define&&define.amd?define(["angular","query-string"],t):"object"==typeof exports?module.exports=t(require("angular"),require("query-string")):e.angularOAuth2=t(e.angular,e.queryString)}(this,function(e,t){function n(e){e.interceptors.push("oauthInterceptor")}function r(e,t,n){return{request:function(e){return n.getAuthorizationHeader()&&(e.headers=e.headers||{},e.headers.Authorization=n.getAuthorizationHeader()),e},responseError:function(r){return 400!==r.status||!r.data||"invalid_request"!==r.data.error&&"invalid_grant"!==r.data.error||(n.removeToken(),t.$emit("oauth:error",r)),(401===r.status&&r.data&&"invalid_token"===r.data.error||r.headers("www-authenticate")&&0===r.headers("www-authenticate").indexOf("Bearer"))&&t.$emit("oauth:error",r),e.reject(r)}}}function o(){var n;this.configure=function(t){if(n)throw new Error("Already configured.");if(!(t instanceof Object))throw new TypeError("Invalid argument: `config` must be an `Object`.");return n=e.extend({},c,t),e.forEach(l,function(e){if(!n[e])throw new Error("Missing parameter: "+e+".")}),"/"===n.baseUrl.substr(-1)&&(n.baseUrl=n.baseUrl.slice(0,-1)),"/"!==n.grantPath[0]&&(n.grantPath="/"+n.grantPath),"/"!==n.revokePath[0]&&(n.revokePath="/"+n.revokePath),n},this.$get=function(r,o){var i=function(){function i(){if(!n)throw new Error("`OAuthProvider` must be configured first.")}return s(i,null,{isAuthenticated:{value:function(){return!!o.getToken()},writable:!0,enumerable:!0,configurable:!0},getAccessToken:{value:function(i,a){if(!i||!i.username||!i.password)throw new Error("`user` must be an object with `username` and `password` properties.");var u={client_id:n.clientId,grant_type:"password",username:i.username,password:i.password};return null!==n.clientSecret&&(u.client_secret=n.clientSecret),u=t.stringify(u),a=e.extend({headers:{"Content-Type":"application/x-www-form-urlencoded"}},a),r.post(""+n.baseUrl+n.grantPath,u,a).then(function(e){return o.setToken(e.data),e})},writable:!0,enumerable:!0,configurable:!0},getRefreshToken:{value:function(){var e={client_id:n.clientId,grant_type:"refresh_token",refresh_token:o.getRefreshToken()};null!==n.clientSecret&&(e.client_secret=n.clientSecret),e=t.stringify(e);var i={headers:{"Content-Type":"application/x-www-form-urlencoded"}};return r.post(""+n.baseUrl+n.grantPath,e,i).then(function(e){return o.setToken(e.data),e})},writable:!0,enumerable:!0,configurable:!0},revokeToken:{value:function(){var e=t.stringify({token:o.getRefreshToken()?o.getRefreshToken():o.getAccessToken()}),i={headers:{"Content-Type":"application/x-www-form-urlencoded"}};return r.post(""+n.baseUrl+n.revokePath,e,i).then(function(e){return o.removeToken(),e})},writable:!0,enumerable:!0,configurable:!0}}),i}();return new i},this.$get.$inject=["$http","OAuthToken"]}function i(t){var n={name:"token",storage:"cookies",options:{secure:!0}};this.configure=function(r){if(!(r instanceof Object))throw new TypeError("Invalid argument: `config` must be an `Object`.");return e.extend(n,r),t.invoke(function(e){e.configure(n)}),n},this.$get=function(e){var t=function(){function t(){}return s(t,null,{setToken:{value:function(t){return e.setToken(t)},writable:!0,enumerable:!0,configurable:!0},getToken:{value:function(){return e.getToken()},writable:!0,enumerable:!0,configurable:!0},getAccessToken:{value:function(){return this.getToken()?this.getToken().access_token:void 0},writable:!0,enumerable:!0,configurable:!0},getAuthorizationHeader:{value:function(){return this.getTokenType()&&this.getAccessToken()?""+(this.getTokenType().charAt(0).toUpperCase()+this.getTokenType().substr(1))+" "+this.getAccessToken():void 0},writable:!0,enumerable:!0,configurable:!0},getRefreshToken:{value:function(){return this.getToken()?this.getToken().refresh_token:void 0},writable:!0,enumerable:!0,configurable:!0},getTokenType:{value:function(){return this.getToken()?this.getToken().token_type:void 0},writable:!0,enumerable:!0,configurable:!0},removeToken:{value:function(){return e.deleteToken()},writable:!0,enumerable:!0,configurable:!0}}),t}();return new t},this.$get.$inject=["OAuthStorage"]}function a(){var t={name:"token",storage:"cookies",options:{secure:!0}};this.configure=function(n){return e.extend(t,n),t},this.$get=function(n,r,o,i){var a,u=t.storage.toLowerCase();"localstorage"===u?a=n:"sessionstorage"===u?a=r:"cookies"===u?a=o:(a=o,i.warn("Set storage to cookies, because storage type is unknown"));var c=function(){function t(e,t){this.storage=e,this.name=t}return s(t,null,{setToken:{value:function(t){return this.storage[this.name]=e.toJson(t)},writable:!0,enumerable:!0,configurable:!0},getToken:{value:function(){return e.fromJson(this.storage[this.name])},writable:!0,enumerable:!0,configurable:!0},deleteToken:{value:function(){delete this.storage[this.name]},writable:!0,enumerable:!0,configurable:!0}}),t}(),l=function(){function e(e,t,n){this.$cookies=e,this.name=t,this.options=n}return s(e,null,{setToken:{value:function(e){return this.$cookies.putObject(this.name,e,this.options)},writable:!0,enumerable:!0,configurable:!0},getToken:{value:function(){return this.$cookies.getObject(this.name)},writable:!0,enumerable:!0,configurable:!0},deleteToken:{value:function(){return this.$cookies.remove(this.name,this.options)},writable:!0,enumerable:!0,configurable:!0}}),e}(),f=function(){function e(e){this.storage=e}return s(e,null,{setToken:{value:function(e){return this.storage.setToken(e)},writable:!0,enumerable:!0,configurable:!0},getToken:{value:function(){return this.storage.getToken()},writable:!0,enumerable:!0,configurable:!0},deleteToken:{value:function(){return this.storage.deleteToken()},writable:!0,enumerable:!0,configurable:!0}}),e}();return a="cookies"===u?new l(a,t.name,t.options):new c(a,t.name),new f(a)},this.$get.$inject=["$localStorage","$sessionStorage","$cookies","$log"]}var u=e.module("angular-oauth2",["ngCookies","ngStorage"]).config(n).factory("oauthInterceptor",r).provider("OAuth",o).provider("OAuthToken",i).provider("OAuthStorage",a);n.$inject=["$httpProvider"],r.$inject=["$q","$rootScope","OAuthToken"];var s=function(e,t,n){t&&Object.defineProperties(e,t),n&&Object.defineProperties(e.prototype,n)},c={baseUrl:null,clientId:null,clientSecret:null,grantPath:"/oauth2/token",revokePath:"/oauth2/revoke"},l=["baseUrl","clientId","grantPath","revokePath"],s=function(e,t,n){t&&Object.defineProperties(e,t),n&&Object.defineProperties(e.prototype,n)},s=function(e,t,n){t&&Object.defineProperties(e,t),n&&Object.defineProperties(e.prototype,n)};return u}); \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index ac63bc0..2c71296 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -16,6 +16,7 @@ module.exports = function(config) { files: [ 'bower_components/angular/angular.js', 'bower_components/angular-cookies/angular-cookies.js', + 'bower_components/ngstorage/ngStorage.js', 'bower_components/query-string/query-string.js', 'node_modules/lodash/dist/lodash.js', 'node_modules/angular-mocks/angular-mocks.js', diff --git a/package.json b/package.json index ea3d80e..b5a9d11 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "browser": { "angular": "./bower_components/angular/angular.js", "angular-cookies": "./bower_components/angular-cookies/angular-cookies.js", + "ngstorage": "./bower_components/ngstorage/ngStorage.js", "query-string": "./bower_components/query-string/query-string.js" }, "scripts": { diff --git a/src/angular-oauth2.js b/src/angular-oauth2.js index befc76f..3de1526 100644 --- a/src/angular-oauth2.js +++ b/src/angular-oauth2.js @@ -8,15 +8,19 @@ import OAuthProvider from './providers/oauth-provider'; import OAuthTokenProvider from './providers/oauth-token-provider'; import oauthConfig from './config/oauth-config'; import oauthInterceptor from './interceptors/oauth-interceptor'; +import OAuthStorageProvider from './services/oauth-storage-provider'; import 'angular-cookies'; +import 'ngstorage'; var ngModule = angular.module('angular-oauth2', [ - 'ngCookies' + 'ngCookies', + 'ngStorage' ]) .config(oauthConfig) .factory('oauthInterceptor', oauthInterceptor) .provider('OAuth', OAuthProvider) .provider('OAuthToken', OAuthTokenProvider) + .provider('OAuthStorage', OAuthStorageProvider) ; /** diff --git a/src/providers/oauth-token-provider.js b/src/providers/oauth-token-provider.js index 271ae9f..c79a9e2 100644 --- a/src/providers/oauth-token-provider.js +++ b/src/providers/oauth-token-provider.js @@ -9,9 +9,10 @@ import angular from 'angular'; * Token provider. */ -function OAuthTokenProvider() { +function OAuthTokenProvider($injector) { var config = { name: 'token', + storage: 'cookies', //cookies, localStorage, sessionStorage options: { secure: true } @@ -32,6 +33,10 @@ function OAuthTokenProvider() { // Extend default configuration. angular.extend(config, params); + $injector.invoke(function (OAuthStorageProvider) { + OAuthStorageProvider.configure(config); + }); + return config; }; @@ -41,7 +46,7 @@ function OAuthTokenProvider() { * @ngInject */ - this.$get = function($cookies) { + this.$get = function(OAuthStorage) { class OAuthToken { /** @@ -49,7 +54,7 @@ function OAuthTokenProvider() { */ setToken(data) { - return $cookies.putObject(config.name, data, config.options); + return OAuthStorage.setToken(data); } /** @@ -57,7 +62,7 @@ function OAuthTokenProvider() { */ getToken() { - return $cookies.getObject(config.name); + return OAuthStorage.getToken(); } /** @@ -101,7 +106,7 @@ function OAuthTokenProvider() { */ removeToken() { - return $cookies.remove(config.name, config.options); + return OAuthStorage.deleteToken(); } } diff --git a/src/services/oauth-storage-provider.js b/src/services/oauth-storage-provider.js new file mode 100644 index 0000000..7ddeffd --- /dev/null +++ b/src/services/oauth-storage-provider.js @@ -0,0 +1,137 @@ +/** + * Module dependencies. + */ + +import angular from 'angular'; + +/** + * OAuthStorage Service. + */ + +function OAuthStorageProvider() { + + var config = { + name: 'token', + storage: 'cookies', //cookies, localStorage, sessionStorage + options: { + secure: true + } + }; + + /** + * Configure. + * + * @param {object} params - An `object` of params to extend. + */ + + this.configure = function(params) { + // Extend default configuration. + angular.extend(config, params); + return config; + }; + + /** + * OAuthStorage Service. + * + * @ngInject + */ + + this.$get = function ($localStorage, $sessionStorage, $cookies, $log) { + var storage; + var ngStorage = config.storage.toLowerCase(); + if (ngStorage === 'localstorage') { + storage = $localStorage; + } + else if (ngStorage === 'sessionstorage') { + storage = $sessionStorage; + } + else if (ngStorage === 'cookies') { + storage = $cookies; + } + else { + storage = $cookies; + $log.warn('Set storage to cookies, because storage type is unknown'); + } + + class BrowserStorage { + constructor(storage, name) { + this.storage = storage; + this.name = name; + } + + setToken(data) { + return (this.storage[this.name] = angular.toJson(data)); + } + + getToken() { + return angular.fromJson(this.storage[this.name]); + } + + deleteToken() { + delete this.storage[this.name]; + } + } + + class CookieStorage { + constructor($cookies, name, options) { + this.$cookies = $cookies; + this.name = name; + this.options = options; + } + + setToken(value) { + return this.$cookies.putObject(this.name, value, this.options); + } + + getToken() { + return this.$cookies.getObject(this.name); + } + + deleteToken() { + return this.$cookies.remove(this.name, this.options); + } + } + + + class OAuthStorage { + constructor(storage) { + this.storage = storage; + } + + /** + * setToken + * + * @param value + * @returns {*} + */ + setToken(value) { + return this.storage.setToken(value); + } + + /** + * getToken + * @returns {*} + */ + getToken() { + return this.storage.getToken(); + } + + deleteToken() { + return this.storage.deleteToken(); + } + } + + storage = ngStorage === 'cookies' ? + new CookieStorage(storage, config.name, config.options) : + new BrowserStorage(storage, config.name); + + return new OAuthStorage(storage); + }; + +} + +/** + * Export `OAuthStorageProvider`. + */ + +export default OAuthStorageProvider;