9 changed files with 141 additions and 33 deletions
@ -1,2 +1,3 @@
@@ -1,2 +1,3 @@
|
||||
.vs |
||||
node_modules |
||||
npm-debug.log |
||||
|
||||
@ -1,3 +1,4 @@
@@ -1,3 +1,4 @@
|
||||
var cryptoService = new CryptoService(); |
||||
var tokenService = new TokenService(); |
||||
var userService = new UserService(tokenService); |
||||
var apiService = new ApiService(tokenService); |
||||
var userService = new UserService(tokenService, apiService); |
||||
|
||||
@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
|
||||
function ApiService(tokenService) { |
||||
this.baseUrl = 'https://api.bitwarden.com'; |
||||
this.tokenService = tokenService; |
||||
}; |
||||
|
||||
!function () { |
||||
ApiService.prototype.getProfile = function (success, error) { |
||||
var self = this; |
||||
this.tokenService.getToken(function(token) { |
||||
$.ajax({ |
||||
type: 'GET', |
||||
url: self.baseUrl + '/accounts/profile', |
||||
data: 'access_token=' + token, |
||||
dataType: 'json', |
||||
success: success, |
||||
error: error |
||||
}); |
||||
}); |
||||
}; |
||||
}(); |
||||
@ -0,0 +1,104 @@
@@ -0,0 +1,104 @@
|
||||
function TokenService() { |
||||
|
||||
}; |
||||
|
||||
!function () { |
||||
var _token; |
||||
|
||||
TokenService.prototype.setToken = function (token, callback) { |
||||
if (!callback || typeof callback !== 'function') { |
||||
throw 'callback function required'; |
||||
} |
||||
|
||||
_token = token; |
||||
chrome.storage.local.set({ |
||||
'authBearer': token |
||||
}, function () { |
||||
callback(); |
||||
}); |
||||
}; |
||||
|
||||
TokenService.prototype.getToken = function (callback) { |
||||
if (!callback || typeof callback !== 'function') { |
||||
throw 'callback function required'; |
||||
} |
||||
|
||||
if (_token) { |
||||
return callback(_token); |
||||
} |
||||
|
||||
chrome.storage.local.get('authBearer', function (obj) { |
||||
if (obj && obj.authBearer) { |
||||
_token = obj.authBearer; |
||||
} |
||||
|
||||
return callback(_token); |
||||
}); |
||||
}; |
||||
|
||||
TokenService.prototype.clearToken = function (callback) { |
||||
if (!callback || typeof callback !== 'function') { |
||||
throw 'callback function required'; |
||||
} |
||||
|
||||
_token = null; |
||||
chrome.storage.local.remove('authBearer', function () { |
||||
callback(); |
||||
}); |
||||
}; |
||||
|
||||
// jwthelper methods
|
||||
// ref https://github.com/auth0/angular-jwt/blob/master/src/angularJwt/services/jwt.js
|
||||
|
||||
TokenService.prototype.decodeToken = function (token) { |
||||
var parts = token.split('.'); |
||||
|
||||
if (parts.length !== 3) { |
||||
throw new Error('JWT must have 3 parts'); |
||||
} |
||||
|
||||
var decoded = urlBase64Decode(parts[1]); |
||||
if (!decoded) { |
||||
throw new Error('Cannot decode the token'); |
||||
} |
||||
|
||||
return JSON.parse(decoded); |
||||
}; |
||||
|
||||
TokenService.prototype.getTokenExpirationDate = function (token) { |
||||
var decoded = this.decodeToken(token); |
||||
|
||||
if (typeof decoded.exp === "undefined") { |
||||
return null; |
||||
} |
||||
|
||||
var d = new Date(0); // The 0 here is the key, which sets the date to the epoch
|
||||
d.setUTCSeconds(decoded.exp); |
||||
|
||||
return d; |
||||
}; |
||||
|
||||
TokenService.prototype.isTokenExpired = function (token, offsetSeconds) { |
||||
var d = this.getTokenExpirationDate(token); |
||||
offsetSeconds = offsetSeconds || 0; |
||||
if (d === null) { |
||||
return false; |
||||
} |
||||
|
||||
// Token expired?
|
||||
return !(d.valueOf() > (new Date().valueOf() + (offsetSeconds * 1000))); |
||||
}; |
||||
|
||||
function urlBase64Decode(str) { |
||||
var output = str.replace(/-/g, '+').replace(/_/g, '/'); |
||||
switch (output.length % 4) { |
||||
case 0: { break; } |
||||
case 2: { output += '=='; break; } |
||||
case 3: { output += '='; break; } |
||||
default: { |
||||
throw 'Illegal base64url string!'; |
||||
} |
||||
} |
||||
return window.decodeURIComponent(escape(window.atob(output))); //polyfill https://github.com/davidchambers/Base64.js
|
||||
}; |
||||
}(); |
||||
Loading…
Reference in new issue