Provide more data to AuthMethod plugins

Oauth will need more information from the main authentication object to
do its job and it is foreseeable that other method plugins will need to
do more complex interactions. We should provide at least the session so
these plugins can communicate out and the base auth option so they can
find authentication parameters. We also allow kwargs for future
expansion.

Change-Id: Ieb1c8df4c90729878a7e4c5732e32d7139dd5855
This commit is contained in:
Jamie Lennox
2014-03-06 15:28:06 +10:00
parent b935741f6c
commit 213616b138

View File

@@ -58,16 +58,20 @@ class Auth(base.BaseIdentityPlugin):
self.project_domain_id = project_domain_id
self.project_domain_name = project_domain_name
@property
def token_url(self):
"""The full URL where we will send authentication data."""
return '%s/auth/tokens' % self.auth_url.rstrip('/')
def get_auth_ref(self, session, **kwargs):
headers = {}
url = self.auth_url + "/auth/tokens"
body = {'auth': {'identity': {}}}
ident = body['auth']['identity']
for method in self.auth_methods:
method, auth_data = method.get_auth_data(headers)
ident.setdefault('methods', []).append(method)
ident[method] = auth_data
name, auth_data = method.get_auth_data(session, self, headers)
ident.setdefault('methods', []).append(name)
ident[name] = auth_data
if not ident:
raise exceptions.AuthorizationFailure('Authentication method '
@@ -98,7 +102,7 @@ class Auth(base.BaseIdentityPlugin):
scope = body['auth'].setdefault('scope', {})
scope['OS-TRUST:trust'] = {'id': self.trust_id}
resp = session.post(url, json=body, headers=headers,
resp = session.post(self.token_url, json=body, headers=headers,
authenticated=False)
return access.AccessInfoV3(resp.headers['X-Subject-Token'],
**resp.json()['token'])
@@ -161,9 +165,11 @@ class AuthMethod(object):
for p in cls.method_parameters])
@abc.abstractmethod
def get_auth_data(self, headers=None):
def get_auth_data(self, session, auth, headers, **kwargs):
"""Return the authentication section of an auth plugin.
:param Session session: The communication session.
:param Auth auth: The auth plugin calling the method.
:param dict headers: The headers that will be sent with the auth
request if a plugin needs to add to them.
:return tuple(string, dict): The identifier of this plugin and a dict
@@ -208,7 +214,7 @@ class PasswordMethod(AuthMethod):
"""
super(PasswordMethod, self).__init__(**kwargs)
def get_auth_data(self, headers=None):
def get_auth_data(self, session, auth, headers, **kwargs):
user = {'password': self.password}
if self.user_id:
@@ -239,7 +245,7 @@ class TokenMethod(AuthMethod):
"""
super(TokenMethod, self).__init__(**kwargs)
def get_auth_data(self, headers=None):
def get_auth_data(self, session, auth, headers, **kwargs):
headers['X-Auth-Token'] = self.token
return 'token', {'id': self.token}