I’ve been working with web technologies for over a decade and never had to touch Digest Access Authentication. All of the services I had worked with had other solutions for authentication. A few months back that all changed. I was finishing up a mobile project, to be used for internal purposes for the client, when suddenly the API requirements changed. They had implemented Digest Access Authentication with MD5. Uh-oh.
What is Digest Authentication?
Let’s start small; I certainly had to. Digest Access Authentication is a method for validating a user and granting them some access over HTTP. It involves making a request, being presented with a challenge, answering that challenge with another request, and finally getting the resource originally requested. It works like this:
- Client sends request to the server
- Server responds with a nonce (number to be used once) with a status of 401
- Client makes another request to the server providing identification information
- Server evaluates whether the user is valid and if they are who they say are
- Server responds with desired resource
How do we do this in Titanium?
The idea is to send out requests like normal, check for a 401 status code, and respond to the presented challenge if applicable. That is simple enough:
When I was originally tackling this problem I found a very helpful example on github by rollsroyc3: https://gist.github.com/rollsroyc3/6869880 The majority of the following code is from that example, but I made a few changes.
Before adding any code to actually handle the challenge, let’s take a step back. Assuming you have multiple HTTPClients, like I did, every HTTPClient would need to be rewritten. Instead, let’s encourage code reuse and turn this into a commonJS lib that wraps the HTTPClient. Then we can have one HTTPClient that does Digest Authentication when it encounters a 401 status code and acts normally with all others:
We can then require this in and use it:
This is just one example of how it can be accomplished. Your needs may be different. There are many more options available to the HTTPClient that are not exposed (like headers). This was a quick and dirty solution to a last minute problem.
If I needed the library today for a new project I would modify it to make use of Backbone events. Imagine different components being notified when a new request has been made, when that request has been met with Digest Access Authentication, and when the response is finally successful! Evented networks are both a blessing and a curse. Allowing various controllers to listen for updates to data is amazing, but if you’re not careful with cleanup then you’re begging for memory leaks.