I think you should implement .remember

see 
https://bitbucket.org/mrtopf/repoze.who.plugins.openid/src/a5fc9e877f3b/repoze/who/plugins/openid/identification.py
for inspiration

On Apr 26, 9:40 pm, Ryan Parrish <[email protected]> wrote:
> I'm developing a TG 2.1 app whose data backend (the Model if you will)
> is a separate RESTful web service that requires basic authentication
> with every request made to it, the TG app basically serves as a proxy
> for normal users to access this WS.
>
> What I have written so far is proof of concept for the controllers
> hitting the web service with hard coded credentials, and an
> IAuthenticator plugin that hits a URL at the web service that will
> return the users UID or a HTTP 401 depending on if the passed
> credentials are accepted.  What I'm stumped at now is how to hold onto
> the passed credentials for the duration of the session so that future
> requests made to the web service can reuse the already known good
> credentials.  I have written an IMetadataProvider that (i think)
> should save the user and password, and I see them in the stdout when I
> do a print statement within the code, however they are no longer there
> when the request finally makes its way to the post_login controller.
>
> Below is what I have thus far, any pointers on what I'm doing wrong
> would be greatly appreciated.
>
> from zope.interface import implements
>
> from repoze.who.interfaces import IMetadataProvider
> from repoze.who.interfaces import IAuthenticator
>
> import urllib2, json
>
> class RestAuthPlugin(object):
>
>     implements(IAuthenticator)
>
>     def __init__(self, auth_url):
>         self.auth_url = auth_url
>
>     # IAuthenticatorPlugin
>     def authenticate(self, environ, identity):
>         try:
>             login = identity['login']
>             password = identity['password']
>         except KeyError:
>             environ['repoze.who.logger'].error('key error')
>             return None
>
>         try:
>             password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
>             password_mgr.add_password(None, self.auth_url, login,
> password)
>             handler = urllib2.HTTPBasicAuthHandler(password_mgr)
>             opener = urllib2.build_opener(handler)
>             opener.addheaders = [('Content-Type', 'application/json;
> charset=utf-8')]
>         except:
>             environ['repoze.who.logger'].error('Could not build
> urllib2 opener')
>             return None
>
>         try:
>             result = opener.open(self.auth_url)
>             details = json.load(result)
>         except urllib2.HTTPError:
>             environ['repoze.who.logger'].warn('failed to auth')
>             return None
>         #print details
>         # details is JSON data {'uid':123, 'user_name':'example_user',
> 'groups':['users']}
>
>         environ['repoze.who.logger'].info('Returned UID: %s' %
> (details['uid'],))
>         #print environ
>         try:
>             int(details['uid'])
>             if details['user_name'] != login:
>                 raise AssertionError
>
>             return details['user_name']
>         except:
>             environ['repoze.who.logger'].error('Failed to double check
> credentials')
>             return None
>         #print environ
>         environ['repoze.who.logger'].error('failsafe')
>         return None #failsafe
>
>     def __repr__(self):
>         return '<%s %s>' % (self.__class__.__name__,
>                             id(self)) #pragma NO COVERAGE
>
> class RestMetadataProvider(object):
>     implements(IMetadataProvider)
>
>     def add_metadata(self, environ, identity):
>         userid = identity.get('repoze.who.userid')
>         if userid:
>             post_val = environ.get('webob._parsed_post_vars')
>             if post_val:
>                 try:
>                     login = post_val[0]['login']
>                     passwd = post_val[0]['password']
>                     identity['user_cred'] = (login, passwd)
>                 except:
>                     print "didn't find credentials"
>                     pass
>         return identity

-- 
You received this message because you are subscribed to the Google Groups 
"TurboGears" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/turbogears?hl=en.

Reply via email to