[Repoze-checkins] r852 - repoze.browserid/trunk
Chris McDonough
chrism at agendaless.com
Sun Mar 23 01:17:43 EDT 2008
Author: Chris McDonough <chrism at agendaless.com>
Date: Sun Mar 23 01:17:43 2008
New Revision: 852
Log:
Document.
Modified:
repoze.browserid/trunk/README.txt
Modified: repoze.browserid/trunk/README.txt
==============================================================================
--- repoze.browserid/trunk/README.txt (original)
+++ repoze.browserid/trunk/README.txt Sun Mar 23 01:17:43 2008
@@ -1,4 +1,69 @@
-Browser id middleware for WSGI, loosely based on the Zope 2 concept of
-browser ids (cookies which represent a browser, for use in sessioning
-libraries).
+repoze.browserid Overview
+
+ Browser id middleware for WSGI, loosely based on the Zope 2 concept
+ of browser ids, which are cookies which represent a browser, for use
+ by sessioning libraries.
+
+Browser Ids
+
+ The concept of a browser id is simple: every request to an
+ application which is fronted by the browser id middleware will
+ include a browser id within the WSGI environment. A browser id is
+ an opaque string that is guaranteed to be unique within the set of
+ all individual user agents which visit the application over the
+ lifetime of that application. This string is most useful as a key
+ in a sessioning system.
+
+ If a user agent contacts the application but does not supply a
+ browser id, one will be manufactured for the current request, and a
+ Set-Cookie header will be returned to the user agent, which it will
+ (hopefully) return on subsequent requests.
+
+ If the user agent does supply a cookie containing a browser id but
+ the cookie value is tampered with by the user or by some middleman,
+ it will be rejected, and a new browser id will be constructed for
+ the current request.
+
+ We set the browser id value as 'repoze.browserid' in the WSGI
+ environ before we call the downstream application. It is a
+ 40-character string.
+
+Uniqueness
+
+ The browser id machinery guarantees uniqueness of browser ids by
+ composing the browser id out of three coponents: a random component,
+ a time component, and a component representing the pid of the
+ process serving the application. The "true" randomness of the
+ random component is guaranteed within a one-second window by
+ specialized code, which, when coupled with the time component,
+ guarantees good uniqueness of browser ids.
+
+Tamper Checking and Varying
+
+ The cookie set by the browser id middleware is forgery-resistant.
+
+ The cookie value of Set-Cookie headers created by the middleware is
+ composed of three parts: the browser id (a unique 40-character
+ string), a delimiter ("!"), and an HMAC of the browser id serialized
+ as a 32-character string.
+
+ When configuring the browserid middleware, you must supply a secret
+ key. The middleware uses the secret key and "vary" values to
+ compose the "tamper key" when creating a browser id. The tamper key
+ is composed of the secret key concatenated with values provided in
+ the environment. Varying allows a configurer to vary the tamper key
+ on, e.g. 'REMOTE_ADDR' if he believes that the same browser id
+ should always be sent from the same IP address, or 'HTTP_USER_AGENT'
+ if he believes it should always come from the same user agent, or
+ some arbitrary combination thereof made out of environ keys.
+
+ When the cookie is composed, An HMAC of the browser id is computed
+ using the tamper key. The HMAC is appended to the browser id after
+ a delimiter character. When a browser id is retrieved from a user
+ agent, the HMAC portion is separated from the browser id and a new
+ HMAC using the same secret key and vary values is computed. If the
+ cookie HMAC matches the computed HMAC, the cookie hasn't been
+ tampered with, and the browser id portion of the cookie becomes the
+ browser id for the current request. If they differ, a new browser
+ id is generated.
More information about the Repoze-checkins
mailing list