diff options
author | Ib Lundgren <ib.lundgren@gmail.com> | 2012-11-23 00:11:22 +0100 |
---|---|---|
committer | Ib Lundgren <ib.lundgren@gmail.com> | 2012-11-23 00:11:22 +0100 |
commit | d421d34541e2b2b35413f941c1c1e60a1e679ae5 (patch) | |
tree | 156baae52ceba67a4180e290aba3a814caa1bb67 | |
parent | 3bcbb25f6b15d23fe79de34389363b0c5f078a82 (diff) | |
download | oauthlib-d421d34541e2b2b35413f941c1c1e60a1e679ae5.tar.gz |
A batch of small fixes and cleanups.
-rw-r--r-- | oauthlib/common.py | 8 | ||||
-rw-r--r-- | oauthlib/oauth2/draft25/__init__.py | 29 | ||||
-rw-r--r-- | oauthlib/oauth2/draft25/grant_types.py | 7 | ||||
-rw-r--r-- | oauthlib/oauth2/draft25/tokens.py | 7 | ||||
-rw-r--r-- | tests/oauth2/draft25/test_grant_types.py | 2 | ||||
-rw-r--r-- | tests/oauth2/draft25/test_server.py | 62 |
6 files changed, 75 insertions, 40 deletions
diff --git a/oauthlib/common.py b/oauthlib/common.py index 7401f0d..a540f79 100644 --- a/oauthlib/common.py +++ b/oauthlib/common.py @@ -274,6 +274,14 @@ class Request(object): self.decoded_body = extract_params(body) self.oauth_params = [] + self._params = {} + self._params.update(dict(urldecode(self.uri_query))) + self._params.update(dict(self.decoded_body or [])) + self._params.update(self.headers) + + def __getattr__(self, name): + return self._params.get(name, None) + @property def uri_query(self): return urlparse.urlparse(self.uri).query diff --git a/oauthlib/oauth2/draft25/__init__.py b/oauthlib/oauth2/draft25/__init__.py index 1ddda44..55eeb1c 100644 --- a/oauthlib/oauth2/draft25/__init__.py +++ b/oauthlib/oauth2/draft25/__init__.py @@ -9,10 +9,7 @@ This module is an implementation of various logic needed for signing and checking OAuth 2.0 draft 25 requests. """ from oauthlib.common import Request -from oauthlib.oauth2.draft25 import errors -from .tokens import prepare_bearer_uri, prepare_bearer_headers -from .tokens import prepare_bearer_body, prepare_mac_header -from .tokens import BearerToken +from oauthlib.oauth2.draft25 import errors, tokens from .parameters import prepare_grant_uri, prepare_token_request from .parameters import parse_authorization_code_response from .parameters import parse_implicit_response, parse_token_response @@ -134,13 +131,13 @@ class Client(object): headers=None, token_placement=None): """Add a bearer token to the request uri, body or authorization header.""" if token_placement == AUTH_HEADER: - headers = prepare_bearer_headers(self.access_token, headers) + headers = tokens.prepare_bearer_headers(self.access_token, headers) elif token_placement == URI_QUERY: - uri = prepare_bearer_uri(self.access_token, uri) + uri = tokens.prepare_bearer_uri(self.access_token, uri) elif token_placement == BODY: - body = prepare_bearer_body(self.access_token, body) + body = tokens.prepare_bearer_body(self.access_token, body) else: raise ValueError("Invalid token placement.") @@ -152,9 +149,9 @@ class Client(object): Warning: MAC token support is experimental as the spec is not yet stable. """ - headers = prepare_mac_header(self.access_token, uri, self.mac_key, http_method, - headers=headers, body=body, ext=ext, - hash_algorithm=self.mac_algorithm, **kwargs) + headers = tokens.prepare_mac_header(self.access_token, uri, + self.mac_key, http_method, headers=headers, body=body, ext=ext, + hash_algorithm=self.mac_algorithm, **kwargs) return uri, headers, body def _populate_attributes(self, response): @@ -569,7 +566,7 @@ class AuthorizationEndpoint(object): def __init__(self, default_token=None, response_types=None): self._response_types = response_types or {} - self._default_token = default_token or BearerToken() + self._default_token = default_token or tokens.BearerToken() @property def response_types(self): @@ -583,8 +580,8 @@ class AuthorizationEndpoint(object): headers=None): """Extract response_type and route to the designated handler.""" request = Request(uri, http_method=http_method, body=body, headers=headers) - query_params = params_from_uri(self.request.uri) - body_params = self.request.decoded_body + query_params = params_from_uri(request.uri) + body_params = request.decoded_body # Prioritize response_type defined as query param over those in body. # Chosen because the two core grant types utilizing the response type @@ -611,7 +608,7 @@ class TokenEndpoint(object): def __init__(self, default_token=None, grant_types=None): self._grant_types = grant_types or {} - self._default_token = default_token or BearerToken() + self._default_token = default_token or tokens.BearerToken() @property def grant_types(self): @@ -649,8 +646,8 @@ class TokenEndpoint(object): class ResourceEndpoint(object): - def __init__(self, tokens=None): - self._tokens = tokens or {'Bearer': BearerToken()} + def __init__(self, token_types=None): + self._tokens = token_types or {'Bearer': tokens.BearerToken()} @property def tokens(self): diff --git a/oauthlib/oauth2/draft25/grant_types.py b/oauthlib/oauth2/draft25/grant_types.py index bc29d17..0060a9f 100644 --- a/oauthlib/oauth2/draft25/grant_types.py +++ b/oauthlib/oauth2/draft25/grant_types.py @@ -78,7 +78,7 @@ class RequestValidator(object): class GrantTypeBase(object): - def create_authorization_response(self, request): + def create_authorization_response(self, request, token_handler): raise NotImplementedError('Subclasses must implement this method.') def create_token_response(self, request, token_handler): @@ -120,7 +120,7 @@ class AuthorizationCodeGrant(GrantTypeBase): grant = self.create_authorization_code(request) self.save_authorization_code(request.client_id, grant) - return add_params_to_uri(request.redirect_uri, grant.items()) + return add_params_to_uri(request.redirect_uri, grant.items()), None, None def create_token_response(self, request, token_handler): """Validate the authorization code. @@ -223,6 +223,9 @@ class ImplicitGrant(GrantTypeBase): def __init__(self, request_validator=None): self.request_validator = request_validator or RequestValidator() + def create_authorization_response(self, request, token_handler): + return self.create_token_response(request, token_handler) + def create_token_response(self, request, token_handler): """Return token or error embedded in the URI fragment. diff --git a/oauthlib/oauth2/draft25/tokens.py b/oauthlib/oauth2/draft25/tokens.py index a21363c..e8a2e93 100644 --- a/oauthlib/oauth2/draft25/tokens.py +++ b/oauthlib/oauth2/draft25/tokens.py @@ -10,7 +10,6 @@ This module contains methods for adding two types of access tokens to requests. """ from binascii import b2a_base64 -import datetime import hashlib import hmac try: @@ -181,10 +180,12 @@ class BearerToken(TokenBase): token = { 'access_token': common.generate_token(), 'expires_in': self.expires_in, - 'scope': ' '.join(request.scopes), 'token_type': 'Bearer', } - if getattr(request, 'state', None): + if request.scopes is not None: + token['scope'] = ' '.join(request.scopes) + + if request.state is not None: token['state'] = request.state if refresh_token: diff --git a/tests/oauth2/draft25/test_grant_types.py b/tests/oauth2/draft25/test_grant_types.py index 091ec9a..791c9ab 100644 --- a/tests/oauth2/draft25/test_grant_types.py +++ b/tests/oauth2/draft25/test_grant_types.py @@ -112,7 +112,7 @@ class ImplicitGrantTest(TestCase): bearer = BearerToken() bearer.save_token = mock.MagicMock() orig_generate_token = common.generate_token - self.addCleanup(setattr, common, 'generage_token', orig_generate_token) + self.addCleanup(setattr, common, 'generate_token', orig_generate_token) common.generate_token = lambda *args, **kwargs: '1234' uri, headers, body = self.auth.create_token_response( self.request, bearer) diff --git a/tests/oauth2/draft25/test_server.py b/tests/oauth2/draft25/test_server.py index 3d09520..cc649ef 100644 --- a/tests/oauth2/draft25/test_server.py +++ b/tests/oauth2/draft25/test_server.py @@ -1,33 +1,57 @@ # -*- coding: utf-8 -*- -from __future__ import absolute_import +from __future__ import absolute_import, unicode_literals from ...unittest import TestCase import mock +import sys -from oauthlib.oauth2.draft25 import AuthorizationEndpoint, TokenEndpoint -from oauthlib.oauth2.draft25 import ResourceEndpoint -from oauthlib.oauth2.draft25.grant_types import AuthorizationCodeGrant -from oauthlib.oauth2.draft25.grant_types import ImplicitGrant -from oauthlib.oauth2.draft25.grant_types import ResourceOwnerPasswordCredentialsGrant -from oauthlib.oauth2.draft25.grant_types import ClientCredentialsGrant +from oauthlib.oauth2 import draft25 +from oauthlib.oauth2.draft25 import grant_types, tokens + + +if sys.version_info[0] == 3: + from imp import reload class AuthorizationEndpointTest(TestCase): + @mock.patch('oauthlib.common.generate_token', new=lambda: 'abc') def setUp(self): + reload(grant_types) # grant_types indirectly import common mock_validator = mock.MagicMock() - auth_code = AuthorizationCodeGrant(request_validator=mock_validator) - implicit = ImplicitGrant(request_validator=mock_validator) + auth_code = grant_types.AuthorizationCodeGrant(request_validator=mock_validator) + auth_code.save_authorization_code = mock.MagicMock() + implicit = grant_types.ImplicitGrant(request_validator=mock_validator) + implicit.save_token = mock.MagicMock() response_types = { 'code': auth_code, 'token': implicit, } - self.endpoint = AuthorizationEndpoint(response_types=response_types) + + # TODO(ib-lundgren): Figure out where in the import order the monkey + # patching of oauthlib.common.generate_token breaks. + class MockToken(tokens.BearerToken): + def __call__(self, request, refresh_token=False): + token = super(MockToken, self).__call__(request, + refresh_token=refresh_token) + token['access_token'] = 'abc' + return token + + token = MockToken() + token.save_token = mock.MagicMock() + self.endpoint = draft25.AuthorizationEndpoint( + default_token=token, response_types=response_types) def test_authorization_grant(self): - pass + uri = 'http://i.b/l?response_type=code&client_id=me&scope=all+of+them' + uri += '&redirect_uri=http%3A%2F%2Fback.to%2Fme' + uri, headers, body = self.endpoint.create_authorization_response(uri) + self.assertURLEqual(uri, 'http://back.to/me?code=abc') def test_implicit_grant(self): - pass + uri = 'http://i.b/l?response_type=token&client_id=me&scope=all+of+them' + uri += '&redirect_uri=http%3A%2F%2Fback.to%2Fme' + uri, headers, body = self.endpoint.create_authorization_response(uri) + self.assertURLEqual(uri, 'http://back.to/me#access_token=abc&expires_in=3600&token_type=Bearer', parse_fragment=True) def test_missing_type(self): pass @@ -38,17 +62,19 @@ class AuthorizationEndpointTest(TestCase): class TokenEndpointTest(TestCase): + @mock.patch('oauthlib.common.generate_token', new=lambda: 'abc') def setUp(self): + reload(grant_types) # grant_types indirectly import common mock_validator = mock.MagicMock() - auth_code = AuthorizationCodeGrant(request_validator=mock_validator) - password = ResourceOwnerPasswordCredentialsGrant(request_validator=mock_validator) - client = ClientCredentialsGrant(request_validator=mock_validator) - grant_types = { + auth_code = grant_types.AuthorizationCodeGrant(request_validator=mock_validator) + password = grant_types.ResourceOwnerPasswordCredentialsGrant(request_validator=mock_validator) + client = grant_types.ClientCredentialsGrant(request_validator=mock_validator) + supported_types = { 'authorization_code': auth_code, 'password': password, 'client_credentials': client, } - self.endpoint = TokenEndpoint(grant_types=grant_types) + self.endpoint = draft25.TokenEndpoint(grant_types=supported_types) def test_authorization_grant(self): pass @@ -69,7 +95,7 @@ class TokenEndpointTest(TestCase): class ResourceEndpointTest(TestCase): def setUp(self): - self.endpoint = ResourceEndpoint() + self.endpoint = draft25.ResourceEndpoint() def test_token_validation(self): pass |