On Fri, 18 Nov 2005 02:12:42 -0500, James Y Knight <[EMAIL PROTECTED]> wrote:

On Nov 17, 2005, at 8:17 AM, [EMAIL PROTECTED] wrote:

Just some random thoughts on authentication. Userid information can come into the app in a wide variety of ways: (...) it has to be passed through to the rest of the site, including passing it on externally via *CGI outgoing REQUEST_USER.

I find that operation to be conceptually separate from the operation of "given an authenticated userid, give me his toplevel Resource". Also completely separate is "gimme a new session". That current guard merges all three together into one operation is where I've always had trouble with it. Sometimes the three intersect, sometimes they don't, it depends upon the application.

There are definitely at least 2 separate levels of abstraction here.

At one level, you are dealing with HTTP objects.  You have resources, and you 
have essentially meaningless strings that allegedly represent usernames (or 
form fields) which must be passed to other things which require access to a 
username.  This is entirely a wiring problem, and the solution is irrelevant to 
application developers.  No request-specific application data passing APIs are 
required for this because all the information you just described is part of 
each HTTP request itself.

At another level, you are authenticating a user to an application written using 
Twisted.  The way Twisted applications should do this is using cred, and the 
web way to use cred is with guard.

Application authors are welcome to use the HTTP protocol and resource model 
traversal code to do something else, if their application requires it.  
However, providing discrete, optional APIs for session-creation, credentials 
passing, and authenticated application object access would be tedious, 
confusing, and ultimately would break any attempts to integrate with cred 
objects that were not originally designed for HTTP.

Let me try to clear up a few misconceptions about cred and guard that seem to 
have crept into the discussion here.

- Resources are lightweight.  You can have a top-level resource object which controls your session.  In other 
frameworks, such an object is called a "controller" for good reason.  There is no reason to have a 
separate 'session' object. What else does a "session object" do, anyway?  Store a dictionary of 
random keys to arbitrary objects?  Namespace conflict and cruft accretion issues abound once you start seeing 
"the session" as a tiny object you can stick bigger things to.  Your top-level resource is your 
application's controller, and it carries both session state and authority.

- Authentication does not imply authorization. You don't have to log in as a user with a username to use the guard style of authentication. You can implicitly authenticate as the anonymous user, which gives you a top-level resource, which is your session. Again, resources are lightweight. It needn't do anything but trivially wrap the shared resource at the top level.
 - If you are getting a LOT of hits, and individual persistent objects for 
sessions really are too heavyweight for you, you don't need to use guard to 
access the static parts of your site.  guard's SessionWrapper doesn't need to 
live at /, it just needs to be somewhere persistent.

- Guard is a higher-level abstraction that is based around resources.  It 
shouldn't be built into the request at all.  There is no need to pay its cost 
if your application is doing something else.

- Guard should be flexible enough to allow for several different kinds of 
authentication mechanisms, not simply the HTTP-form-post mechanism it provides 
today.  It should let resources create credentials and pass them to the realm 
in whatever way makes the most sense for the desired user-experience.  It is 
currently extremely inflexible in this regard and I think it's just broken.

- Guard should allow the session to be pluggable, using cookies, digest 
authentication, headers, tunable timeouts, etc.

I am open to suggestions as to how to do cred-style authentication with an interface that 
isn't IResource, if something else makes more sense there.  I am doubtful but not 
implacable.  However, web2 is definitely going to include something an awful lot like 
guard before its final release.  Twisted is unfortunately thin on unifying abstractions 
currently, and cred is the best one we have.  The alternative to cred-style 
authentication in web2 is a new, better unifying abstraction plus a rewrite of the 
relevant portions of at least SIP, IMAP4, POP3, SMTP, Telnet, SSH, FTP, and IRC.  This is 
what I meant by "cred is non-negotiable".

_______________________________________________
Twisted-web mailing list
[email protected]
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web

Reply via email to