Ignore:
Timestamp:
06/26/13 21:17:41 (12 years ago)
Author:
hendrikvanantwerpen
Message:

Improved authentication

  • Authentication cannot be cancelled, removing a lot of weird race conditions.
  • We offer a request provider that has automatic retry in case of authentication failures.
  • Reduced dependency on LoginDialog? by having it act independent based on events. Other modules can just depend on 'session'.
File:
1 moved

Legend:

Unmodified
Added
Removed
  • Dev/trunk/src/client/qed-client/request.js

    r464 r468  
    11define([
     2    "./session",
    23    "dojo/Deferred",
     4    "dojo/on",
    35    "dojo/request"
    4 ], function(Deferred, request) {
     6], function(session, Deferred, on, request) {
    57
    6     var authenticated = true;
     8    var user = session.get();
    79    var queue = [];
    810   
     11    on(session, 'change', function(newUser) {
     12        user = newUser;
     13        if ( user ) {
     14            retry();
     15        }
     16    });
     17   
     18    function retry() {
     19        if (queue.length > 0) {
     20            var item = queue.shift();
     21            console.log("Retry",item.url);
     22            real_request(item);
     23        }
     24    }
     25   
     26    function real_request(item) {
     27        var req = request(item.url,item.options);
     28
     29        // forward successfull response
     30        req.then(function(body){
     31            item.dfd.resolve(body);
     32        });
     33
     34        // handle unauthenticated and queued requests
     35        req.response.then(function(response){
     36            retry();
     37        }, function(error) {
     38            if ( error.response.status === 401 ) {
     39                queue.unshift(item);
     40                session.restore();
     41            } else {
     42                item.dfd.reject(error); // this should be error body
     43                                        // not, the request?
     44                retry();
     45            }
     46        });
     47    }
     48   
    949    var _request = function(url, options) {
    10         var dfd = new Deferred();
    11         if ( authenticated ) {
    12             var req = request(url,options);
     50        var item = {
     51            url: url,
     52            options: options,
     53            dfd: new Deferred()
     54        };
     55        // only do the request directly if we are authenticated and
     56        // there are no earlier requests queued.
     57        if ( user && queue.length === 0 ) {
     58            console.log("Request",url);
     59            real_request(item);
     60        } else {
     61            console.log("Push",url);
     62            queue.push(item);
     63        }
     64        return item.dfd.promise;
     65    };
    1366
    14             // forward successfull response
    15             req.then(function(data){
    16                 dfd.resolve(data);
    17             });
    18            
    19             req.response.then(function(response){
    20                 // if we are recovering, launch other requests
    21             }, function(error) {
    22                 if ( error.response.status === 401 ) {
    23                     queue.push({
    24                         url: url,
    25                         options: options,
    26                         dfd: dfd
    27                     });
    28                     console.log("Retry goes here :)");
    29                 } else {
    30                     dfd.reject(error);
    31                 }
    32             });
    33         } else {
    34             queue.push({
    35                 url: url,
    36                 options: options,
    37                 dfd: dfd
    38             });
    39         }
    40         return dfd.promise;
    41     };
    4267    return _request;
    4368});
Note: See TracChangeset for help on using the changeset viewer.