changeset 1503:4fd4edc35b6d

Inspect OpenID token and check expiration.
author robcast
date Mon, 25 Apr 2016 12:56:14 +0200
parents 0d5c86055c79
children 809b69312e60
files webapp/src/main/webapp/jquery/jquery.digilib.oauth.js
diffstat 1 files changed, 87 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/webapp/src/main/webapp/jquery/jquery.digilib.oauth.js	Tue Apr 19 10:31:45 2016 +0200
+++ b/webapp/src/main/webapp/jquery/jquery.digilib.oauth.js	Mon Apr 25 12:56:14 2016 +0200
@@ -69,6 +69,9 @@
     };
                 
 
+    /**
+     * Authenticate by redirecting to auth server.
+     */
     var authenticate = function (data) {
         console.debug("oauth: authenticate.");
         var url = fn.getDigilibUrl(data);
@@ -79,13 +82,15 @@
                 'scope' : 'openid'
         };
         var qs = fn.getParamString(authReq, Object.keys(authReq));
+        // redirect to auth server
         window.location.assign(data.settings.authServerUrl + '?' + qs);
     };
     
     
     /**
      * Handle parameter unpacking event.
-     * Make sure the errcode flag is set.
+     * Gets token from URL fragment or cookie.
+     * Sets errcode flag if required.
      */
     var handleUnpack = function (evt) {
         console.debug("oauth: handleUnpack");
@@ -109,6 +114,7 @@
                 data.settings.id_token = data.dlOpts.id_token;                
             }
         }
+        checkToken(data);
         // set scaler errcode mode
         if (data.settings.authOnErrorMode) {
             var flags = data.scalerFlags;
@@ -123,6 +129,73 @@
         }
     };
 
+    /**
+     * Check the id_token for well-formedness and validity,
+     * including expiry.
+     * 
+     * Discards the token if it is not valid.
+     */
+    var checkToken = function (data) {
+        console.debug("check token!");
+        var token = data.settings.id_token;
+        if (! token) {
+            console.debug("no token.");
+            return;
+        }
+        var parts = token.split('.');
+        if (parts.length != 3) {
+            console.error("Not well formed token!");
+            discardToken(data);
+            return;
+        }
+        var content = window.atob(parts[1]);
+        var payload = JSON.parse(content);
+        if (payload != null) {
+            console.debug("id_token:", payload);
+            // user name
+            var sub = payload['sub'];
+            // expiration date
+            var exp = payload['exp'];
+            if (sub && exp) {
+                var now = Date.now() / 1000;
+                if (exp - now < 300) {
+                    console.error("id_token expired!");
+                    discardToken(data);
+                    return;
+                } else {
+                    // set user name
+                    data.settings.id_token_sub = sub;
+                    return;
+                }
+            }
+        }
+        console.error("Invalid token!");
+        discardToken(data);
+    };
+    
+    /**
+     * Discard the id_token.
+     */
+    var discardToken = function (data) {
+        delete data.settings.id_token;
+        delete data.dlOpts.id_token;
+        fn.storeOptions(data);
+    };
+    
+    /**
+     * Display the authentication state on the authenticate button.
+     */
+    var showAuthState = function (data) {
+        var text = "Log in";
+        var user = data.settings.id_token_sub;
+        if (user) {
+            text = "Logged in as: " + user;
+        }
+        // show annotation user state
+        data.$elem.find('div#'+data.settings.cssPrefix+'button-authenticate')
+        .attr('title', text);
+    }
+    
     /** 
      * Handle image load error.
      * 
@@ -149,6 +222,17 @@
             }
         }
     };
+    
+    /**
+     * Handle the update event.
+     * 
+     * Calls showAuthState()
+     */
+    var handleUpdate = function (evt) {
+        console.debug("oauth: handleUpdate");
+        var data = this;
+        showAuthState(data);
+    }
 
     /** 
      * install additional buttons
@@ -188,8 +272,9 @@
         // install event handler
         $data.bind('unpack', handleUnpack);
         if (data.settings.authOnErrorMode) {
-            $data.bind('imgerror', handleImgerror);
+            $data.on('imgerror', handleImgerror);
         }
+        $data.on('update', handleUpdate);
     };