/
/notes.org
 1 #+TITLE: Site-Controlled HTTP Authentication UI
 2 * Motivation
 3 HTTP Authentication is significantly less fundamentally broken than cookie-based
 4 authentication.  And, while I've been meaning to write this up for years, the
 5 recent release of [[http://codebutler.com/firesheep][Firesheep]] has brought the issue to the fore once again.
 6 
 7 [tdm] explains many of the issues involved, so I'll just summarize briefly:
 8  1. The browser UI for HTTP Authentication sucks
 9  2. Websites want to control that UI
10 
11 A natural consequence of these two things is that no sites use HTTP
12 Authentication, and browser vendors don't bother to make it not suck.
13 
14 This is my proposal to make HTTP Authentication website-controlled, while
15 remaining backwards compatible with form-based authentication in browsers which
16 do not support the proposal.
17 * Proposal
18 ** HTML Forms
19 Login forms need add only a single class to their <form> tag:
20 "http-authentication".  This class signals to the browser that it should use the
21 "username" and "password" fields for this form as the corresponding fields in
22 HTTP Authentication.  These fields MUST NOT be submitted with the rest of the
23 form when using HTTP Authentication.
24 
25 Any additional information necessary to perform authentication (nonces, etc.)
26 should be pulled from the standard WWW-Authenticate headers.
27 
28 Any fields in the login form not understood by the browser as part of a login
29 request MUST be submitted as normal for the provided form.
30 ** Changes to RFC 2617
31 WWW-Authenticate headers MAY be sent along with 2xy and 3xy responses to
32 indicate that a page supports optional authentication.  Vary: Authorization and
33 appropriate Cache-Control headers should be used when doing so to allow caches
34 to work properly.
35 
36 A browser using form-based HTTP Authentication MAY use data acquired from a
37 WWW-Authenticate header sent with the form to authenticate itself without the
38 additional round-trip that would otherwise be required.
39 ** Stopgap Measure
40 To use this feature before sites implement it, sites may use JavaScript
41 techniques along the lines of [peej] to silently force the browser into HTTP
42 Authentication.
43 
44 I've set up a (very rough) example at http://httpauth.kepibu.org/login.php.  The
45 source code contains additional comments relevant to implementers of the stopgap
46 measure and can be fetched as a darcs repository via the command
47 :  darcs get http://repo.kepibu.org/httpauth/
48 
49 ** Working with the Stopgap Measure in Browsers that Support This Spec
50 Assuming sites implement the stopgap measure, and browsers later introduce
51 native support for this specification, it becomes important for browsers and
52 sites to communicate with each other about who is in charge of handling the
53 form-to-http-auth transition.
54 
55 As someone who loathes the number of sites that fall apart with JS disabled, it
56 is tempting to simply say browsers should refuse to fire JavaScript events on
57 the submission of http-authentication forms.  However, since sites will almost
58 certainly be doing other things in the JavaScript for those forms, that is not a
59 viable option.
60 
61 Instead, it seems prudent to utilize the DOMImplementation hasFeature function.
62 Thus, I propose a feature name of "HTTPFormAuth" and a version of "1.0".
63 ** Logging Out
64 Forcing logout for users is left to a future version of this specification.  See
65 [tdm] for ideas.
66 * References
67  * [tdm]  :: Weaning the Web off of Session Cookies (Timothy Morgan, 26 Jan 2010)
68    http://www.vsecurity.com/download/papers/WeaningTheWebOffOfSessionCookies.pdf
69  * [peej] :: HTTP Authentication with HTML Forms (Paul James, 03 Feb 2006)
70    http://www.peej.co.uk/articles/http-auth-with-html-forms.html
71  * [ha]   :: HTTP Authentication: Basic and Digest Authentication (RFC 2617, Jun 1999)
72    http://tools.ietf.org/html/rfc2617
73  * [w3]   :: User Agent Authentication Forms (W3C Note, 03 Feb 1999)
74    http://www.w3.org/TR/NOTE-authentform
75 * flyspell                                                         :noexport:
76 LocalWords:  UI LocalWords Firesheep peej authentform html tdm Login http login
77 LocalWords:  username nonces pdf JavaScript auth JS natively logout xy darcs
78 LocalWords:  php