How to design authentication and authorization system for REST backend / Ajax front End Application

ams picture ams · Feb 12, 2011 · Viewed 12k times · Source

I am starting a new project where we are planing to build a restful back end and an AJAX font end. I am approaching the problem by focusing on Identifying all the resources that I have and what the various HTTP verbs will do them, their URI and the JSON representations of those resources.

I am looking for the best design for securing the backend. Here is the list of designs I have considered. I am looking for alternative designs not listed below, and pros, cons recommendations. The system will be implemented with Spring 3.0 and possibly Spring Security 3.0, SSL will be used for many parts of the system but not for all of them, so some requests may come on SSL and some might not.

Option 1: Use the HTTP session

Show a standard login screen, create a server side session and let tomcat send back a jsessionid cookie and have the ajax client include the JSESSIONID cookie on every XHR request. This options just feels like it's the wrong approach for the following reasons.

  • The connection becomes statefull which is against the rules of REST
  • I want to be able to split the bakcend into multiple seperate WAR files which means i could have multiple HTTP sessions on the backend, if that is the case then this approach does not work. While I don't need the ability to split the backend into multiple apps today, I would prefer a design that allows for that possibility.

Option 2: Find an open source Java based security library that does this

Other than Spring security I have not found any other Java libraries, any recommendations are highly appreciated.

Option 3: Try to use an existing protocol like OAuth

In my very brief look at OAuth it seems that it is designed for authentication across sites where each site has it's own user database. In this system i want a global user database shared across all the backend ajax services.

Option 4: Use SAML and Shiboleth

This options seems over kill and hugely complex to setup and maintain.

Option 5: Send the username and password with every request

This requires that user sends their username and password with every request, which means that the front end AJAX app must store the username and password as a JavaScript object and if the user navigates away from the page then back the username/password combo will be gone and the user might be forced to log in again. I don't want the front end to try and put the username and password into cookie as that would comprise security.

Option 6: Implement my own authentication / Authorization protocol

Create a REST service that users can present their username/password combination to and then get back and security token, which they must send back to the service with every request. The security token would be digitally signed by the service and would have an expiry time. The token would be only good for most operations high security operations would require a new login screen as port of confirming the operation.

Problem with this approach is I have to invent yet another security protocol which seems like a total waste of time.

I am sure I am not the only person up against this problem, I hope the stack overflow community can point to some options and tools that I have not found yet.

Answer

sourcedelica picture sourcedelica · Feb 13, 2011

Take a look at Apache Shiro. It is an authentication system that has a session management feature that can be used to share sessions across applications. This may be the easiest thing to do.

Or you could use Spring Security (or Shiro) with a Remember Me cookie that is shared across the webapps (as long as they are in the same HTTP domain). The remember me cookie would be analogous to your token in option 6. You can set the expiration on the cookie that so it is short lived like a session cookie or long lived like a regular remember me.