Eric, I may have found a way to do it, but it's not pretty.

Create a controller that only has login / logout methods. The login method 
will return your token that is saved somewhere (cache or database).

Then in other controllers where you need to enforce token authentication, 
put this into your call() method:

if 'token' in request.vars:
        token = request.vars.token
        if token != 'test':   # you would put your own token checking logic 
here
            raise HTTP(401, 'Supplied token was not valid.')
    else:
        raise HTTP(401, 'Token must supplied as a variable in the query 
string.')
        
    return service()


Now, to get a token, call your login method (that is in another controller):

x = 
xmlrpclib.ServerProxy('http://127.0.0.1:8000/rpc_test/auth/login/xmlrpc')

try:
    token = x.login(username, password) 
except:
    print 'Login failed'

x = 
xmlrpclib.ServerProxy('http://127.0.0.1:8000/rpc_test/my_controller/call/xmlrpc?token=%s'
 
% token)

try:
    x.my_method(a, b)
    x.add(1,2)
except:
    print 'Not authorized'

What happens here is you login, get the token, then make a new connection 
with the token, which is checked for every call you make to my_controller. 
You do not need to include the token in the API at all with this method, but 
again, it's kind of a hacky way to do it. I'm not sure how X509 works, but 
if Massimo says that's the way to go, then I'm going to wait before 
implementing it the way described here. I have a couple of weeks before I 
have to worry about this, I'm just doing preliminary research right now.

Reply via email to