Skip to content

Commit 0bcd9af

Browse files
author
OpenShift Bot
committed
Merge pull request #2302 from liggitt/ui_token_expiration
Merged by openshift-bot
2 parents d391684 + 4959172 commit 0bcd9af

File tree

6 files changed

+96
-34
lines changed

6 files changed

+96
-34
lines changed

assets/app/scripts/controllers/util/oauth.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ angular.module('openshiftConsole')
1515
.then(function(data) {
1616
var token = data.token;
1717
var then = data.then;
18+
var ttl = data.ttl;
1819

1920
// Try to fetch the user
2021
var opts = {errorNotification: false, http: {auth: {token: token, triggerLogin: false}}};
@@ -24,7 +25,7 @@ angular.module('openshiftConsole')
2425
.then(function(user) {
2526
// Set the new user and token in the auth service
2627
authLogger.log("OAuthController, got user", user);
27-
AuthService.setUser(user, token);
28+
AuthService.setUser(user, token, ttl);
2829

2930
// Redirect to original destination (or default to '/')
3031
var destination = then || './';

assets/app/scripts/services/auth.js

+7-6
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ angular.module('openshiftConsole')
77
// withUser()
88
// returns a promise that resolves when there is a current user
99
// starts a login if there is no current user
10-
// setUser(user, token)
10+
// setUser(user, token[, ttl])
1111
// sets the current user and token to use for authenticated requests
12+
// if ttl is specified, it indicates how many seconds the user and token are valid
1213
// triggers onUserChanged callbacks if the new user is different than the current user
1314
// requestRequiresAuth(config)
1415
// returns true if the request is to a protected URL
@@ -91,11 +92,11 @@ angular.module('openshiftConsole')
9192
}
9293
},
9394

94-
setUser: function(user, token) {
95-
authLogger.log('AuthService.setUser()', user, token);
95+
setUser: function(user, token, ttl) {
96+
authLogger.log('AuthService.setUser()', user, token, ttl);
9697
var oldUser = userStore.getUser();
97-
userStore.setUser(user);
98-
userStore.setToken(token);
98+
userStore.setUser(user, ttl);
99+
userStore.setToken(token, ttl);
99100

100101
$rootScope.user = user;
101102

@@ -146,7 +147,7 @@ angular.module('openshiftConsole')
146147
}
147148
var self = this;
148149
_loginPromise = loginService.login().then(function(result) {
149-
self.setUser(result.user, result.token);
150+
self.setUser(result.user, result.token, result.ttl);
150151
_loginCallbacks.fire(result.user);
151152
}).catch(function(err) {
152153
Logger.error(err);

assets/app/scripts/services/login.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ angular.module('openshiftConsole')
2828
var authLogger = Logger.get("auth");
2929

3030
return {
31-
// Returns a promise that resolves with {user:{...}, token:''}, or rejects with {error:'...'[,error_description:'...',error_uri:'...']}
31+
// Returns a promise that resolves with {user:{...}, token:'...', ttl:X}, or rejects with {error:'...'[,error_description:'...',error_uri:'...']}
3232
login: function() {
3333
if (_oauth_client_id == "") {
3434
return $q.reject({error:'invalid_request', error_description:'RedirectLoginServiceProvider.OAuthClientID() not set'});
@@ -45,7 +45,7 @@ angular.module('openshiftConsole')
4545
uri.query({
4646
client_id: _oauth_client_id,
4747
response_type: 'token',
48-
state: $location.url(), // TODO: get state working
48+
state: $location.url(),
4949
redirect_uri: _oauth_redirect_uri,
5050
});
5151
authLogger.log("RedirectLoginService.login(), redirecting", uri.toString());
@@ -86,6 +86,7 @@ angular.module('openshiftConsole')
8686
var deferred = $q.defer();
8787
deferred.resolve({
8888
token: fragmentParams.access_token,
89+
ttl: fragmentParams.expires_in,
8990
then: fragmentParams.state
9091
});
9192
return deferred.promise;

assets/app/scripts/services/userstore.js

+53-9
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,17 @@ angular.module('openshiftConsole')
1313
authLogger.log("MemoryUserStore.getUser", _user);
1414
return _user;
1515
},
16-
setUser: function(user) {
16+
setUser: function(user, ttl) {
17+
// TODO: honor ttl
1718
authLogger.log("MemoryUserStore.setUser", user);
1819
_user = user;
1920
},
2021
getToken: function() {
2122
authLogger.log("MemoryUserStore.getToken", _token);
2223
return _token;
2324
},
24-
setToken: function(token) {
25+
setToken: function(token, ttl) {
26+
// TODO: honor ttl
2527
authLogger.log("MemoryUserStore.setToken", token);
2628
_token = token;
2729
}
@@ -55,7 +57,8 @@ angular.module('openshiftConsole')
5557
return null;
5658
}
5759
},
58-
setUser: function(user) {
60+
setUser: function(user, ttl) {
61+
// TODO: honor ttl
5962
if (user) {
6063
authLogger.log("SessionStorageUserStore.setUser", user);
6164
sessionStorage[userkey] = JSON.stringify(user);
@@ -74,7 +77,8 @@ angular.module('openshiftConsole')
7477
return null;
7578
}
7679
},
77-
setToken: function(token) {
80+
setToken: function(token, ttl) {
81+
// TODO: honor ttl
7882
if (token) {
7983
authLogger.log("SessionStorageUserStore.setToken", token);
8084
sessionStorage[tokenkey] = token;
@@ -91,6 +95,30 @@ angular.module('openshiftConsole')
9195
var authLogger = Logger.get("auth");
9296
var userkey = "LocalStorageUserStore.user";
9397
var tokenkey = "LocalStorageUserStore.token";
98+
99+
var ttlKey = function(key) {
100+
return key + ".ttl";
101+
};
102+
var setTTL = function(key, ttl) {
103+
if (ttl) {
104+
var expires = new Date().getTime() + ttl*1000;
105+
localStorage[ttlKey(key)] = expires;
106+
authLogger.log("LocalStorageUserStore.setTTL", key, ttl, new Date(expires).toString());
107+
} else {
108+
localStorage.removeItem(ttlKey(key));
109+
authLogger.log("LocalStorageUserStore.setTTL deleting", key);
110+
}
111+
};
112+
var isTTLExpired = function(key) {
113+
var ttl = localStorage[ttlKey(key)];
114+
if (!ttl) {
115+
return false;
116+
}
117+
var expired = parseInt(ttl) < new Date().getTime();
118+
authLogger.log("LocalStorageUserStore.isTTLExpired", key, expired);
119+
return expired;
120+
};
121+
94122
return {
95123
available: function() {
96124
try {
@@ -105,6 +133,12 @@ angular.module('openshiftConsole')
105133
},
106134
getUser: function(){
107135
try {
136+
if (isTTLExpired(userkey)) {
137+
authLogger.log("LocalStorageUserStore.getUser expired");
138+
localStorage.removeItem(userkey);
139+
setTTL(userkey, null);
140+
return null;
141+
}
108142
var user = JSON.parse(localStorage[userkey]);
109143
authLogger.log("LocalStorageUserStore.getUser", user);
110144
return user;
@@ -113,17 +147,25 @@ angular.module('openshiftConsole')
113147
return null;
114148
}
115149
},
116-
setUser: function(user) {
150+
setUser: function(user, ttl) {
117151
if (user) {
118-
authLogger.log("LocalStorageUserStore.setUser", user);
152+
authLogger.log("LocalStorageUserStore.setUser", user, ttl);
119153
localStorage[userkey] = JSON.stringify(user);
154+
setTTL(userkey, ttl);
120155
} else {
121156
authLogger.log("LocalStorageUserStore.setUser", user, "deleting");
122157
localStorage.removeItem(userkey);
158+
setTTL(userkey, null);
123159
}
124160
},
125161
getToken: function() {
126162
try {
163+
if (isTTLExpired(tokenkey)) {
164+
authLogger.log("LocalStorageUserStore.getToken expired");
165+
localStorage.removeItem(tokenkey);
166+
setTTL(tokenkey, null);
167+
return null;
168+
}
127169
var token = localStorage[tokenkey];
128170
authLogger.log("LocalStorageUserStore.getToken", token);
129171
return token;
@@ -132,13 +174,15 @@ angular.module('openshiftConsole')
132174
return null;
133175
}
134176
},
135-
setToken: function(token) {
177+
setToken: function(token, ttl) {
136178
if (token) {
137-
authLogger.log("LocalStorageUserStore.setToken", token);
179+
authLogger.log("LocalStorageUserStore.setToken", token, ttl);
138180
localStorage[tokenkey] = token;
181+
setTTL(tokenkey, ttl);
139182
} else {
140-
authLogger.log("LocalStorageUserStore.setToken", token, "deleting");
183+
authLogger.log("LocalStorageUserStore.setToken", token, ttl, "deleting");
141184
localStorage.removeItem(tokenkey);
185+
setTTL(tokenkey, null);
142186
}
143187
}
144188
}

assets/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
"karma-phantomjs-launcher": "0.1.4",
4545
"less": "2.4.0",
4646
"load-grunt-tasks": "0.4.0",
47-
"lodash": "^3.8.0",
47+
"lodash": "3.2.0",
4848
"phantomjs": "1.9.15",
4949
"pretty-bytes": "1.0.4",
5050
"protractor": "1.7.0",

pkg/assets/bindata.go

+30-15
Original file line numberDiff line numberDiff line change
@@ -20363,7 +20363,19 @@ a ? (b.log("SessionStorageUserStore.setToken", a), sessionStorage[d] = a) :(b.lo
2036320363
} ];
2036420364
}).provider("LocalStorageUserStore", function() {
2036520365
this.$get = [ "Logger", function(a) {
20366-
var b = a.get("auth"), c = "LocalStorageUserStore.user", d = "LocalStorageUserStore.token";
20366+
var b = a.get("auth"), c = "LocalStorageUserStore.user", d = "LocalStorageUserStore.token", e = function(a) {
20367+
return a + ".ttl";
20368+
}, f = function(a, c) {
20369+
if (c) {
20370+
var d = new Date().getTime() + 1e3 * c;
20371+
localStorage[e(a)] = d, b.log("LocalStorageUserStore.setTTL", a, c, new Date(d).toString());
20372+
} else localStorage.removeItem(e(a)), b.log("LocalStorageUserStore.setTTL deleting", a);
20373+
}, g = function(a) {
20374+
var c = localStorage[e(a)];
20375+
if (!c) return !1;
20376+
var d = parseInt(c) < new Date().getTime();
20377+
return b.log("LocalStorageUserStore.isTTLExpired", a, d), d;
20378+
};
2036720379
return {
2036820380
available:function() {
2036920381
try {
@@ -20377,25 +20389,27 @@ return !1;
2037720389
},
2037820390
getUser:function() {
2037920391
try {
20392+
if (g(c)) return b.log("LocalStorageUserStore.getUser expired"), localStorage.removeItem(c), f(c, null), null;
2038020393
var a = JSON.parse(localStorage[c]);
2038120394
return b.log("LocalStorageUserStore.getUser", a), a;
2038220395
} catch (d) {
2038320396
return b.error("LocalStorageUserStore.getUser", d), null;
2038420397
}
2038520398
},
20386-
setUser:function(a) {
20387-
a ? (b.log("LocalStorageUserStore.setUser", a), localStorage[c] = JSON.stringify(a)) :(b.log("LocalStorageUserStore.setUser", a, "deleting"), localStorage.removeItem(c));
20399+
setUser:function(a, d) {
20400+
a ? (b.log("LocalStorageUserStore.setUser", a, d), localStorage[c] = JSON.stringify(a), f(c, d)) :(b.log("LocalStorageUserStore.setUser", a, "deleting"), localStorage.removeItem(c), f(c, null));
2038820401
},
2038920402
getToken:function() {
2039020403
try {
20404+
if (g(d)) return b.log("LocalStorageUserStore.getToken expired"), localStorage.removeItem(d), f(d, null), null;
2039120405
var a = localStorage[d];
2039220406
return b.log("LocalStorageUserStore.getToken", a), a;
2039320407
} catch (c) {
2039420408
return b.error("LocalStorageUserStore.getToken", c), null;
2039520409
}
2039620410
},
20397-
setToken:function(a) {
20398-
a ? (b.log("LocalStorageUserStore.setToken", a), localStorage[d] = a) :(b.log("LocalStorageUserStore.setToken", a, "deleting"), localStorage.removeItem(d));
20411+
setToken:function(a, c) {
20412+
a ? (b.log("LocalStorageUserStore.setToken", a, c), localStorage[d] = a, f(d, c)) :(b.log("LocalStorageUserStore.setToken", a, c, "deleting"), localStorage.removeItem(d), f(d, null));
2039920413
}
2040020414
};
2040120415
} ];
@@ -20430,12 +20444,12 @@ withUser:function() {
2043020444
var a = p.getUser();
2043120445
return a ? (h.user = a, j.log("AuthService.withUser()", a), e.when(a)) :(j.log("AuthService.withUser(), calling startLogin()"), this.startLogin());
2043220446
},
20433-
setUser:function(a, b) {
20434-
j.log("AuthService.setUser()", a, b);
20435-
var c = p.getUser();
20436-
p.setUser(a), p.setToken(b), h.user = a;
20437-
var d = c && c.metadata && c.metadata.name, e = a && a.metadata && a.metadata.name;
20438-
d != e && (j.log("AuthService.setUser(), user changed", c, a), m.fire(a));
20447+
setUser:function(a, b, c) {
20448+
j.log("AuthService.setUser()", a, b, c);
20449+
var d = p.getUser();
20450+
p.setUser(a, c), p.setToken(b, c), h.user = a;
20451+
var e = d && d.metadata && d.metadata.name, f = a && a.metadata && a.metadata.name;
20452+
e != f && (j.log("AuthService.setUser(), user changed", d, a), m.fire(a));
2043920453
},
2044020454
requestRequiresAuth:function(a) {
2044120455
var b = a.url.toString().indexOf("api/") > 0;
@@ -20451,7 +20465,7 @@ startLogin:function() {
2045120465
if (n) return j.log("Login already in progress"), n;
2045220466
var a = this;
2045320467
return n = q.login().then(function(b) {
20454-
a.setUser(b.user, b.token), k.fire(b.user);
20468+
a.setUser(b.user, b.token, b.ttl), k.fire(b.user);
2045520469
})["catch"](function(a) {
2045620470
i.error(a);
2045720471
})["finally"](function() {
@@ -21085,6 +21099,7 @@ if (c.access_token && "bearer" == c.token_type) {
2108521099
var j = e.defer();
2108621100
return j.resolve({
2108721101
token:c.access_token,
21102+
ttl:c.expires_in,
2108821103
then:c.state
2108921104
}), j.promise;
2109021105
}
@@ -21814,7 +21829,7 @@ b.unwatchAll(d);
2181421829
} ]), angular.module("openshiftConsole").controller("OAuthController", [ "$location", "$q", "RedirectLoginService", "DataService", "AuthService", "Logger", function(a, b, c, d, e, f) {
2181521830
var g = f.get("auth");
2181621831
c.finish().then(function(b) {
21817-
var c = b.token, f = b.then, h = {
21832+
var c = b.token, f = b.then, h = b.ttl, i = {
2181821833
errorNotification:!1,
2181921834
http:{
2182021835
auth:{
@@ -21823,8 +21838,8 @@ triggerLogin:!1
2182321838
}
2182421839
}
2182521840
};
21826-
g.log("OAuthController, got token, fetching user", h), d.get("users", "~", {}, h).then(function(b) {
21827-
g.log("OAuthController, got user", b), e.setUser(b, c);
21841+
g.log("OAuthController, got token, fetching user", i), d.get("users", "~", {}, i).then(function(b) {
21842+
g.log("OAuthController, got user", b), e.setUser(b, c, h);
2182821843
var d = f || "./";
2182921844
URI(d).is("absolute") && (g.log("OAuthController, invalid absolute redirect", d), d = "./"), g.log("OAuthController, redirecting", d), a.url(d);
2183021845
})["catch"](function(b) {

0 commit comments

Comments
 (0)