summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIb Lundgren <ib.lundgren@gmail.com>2012-11-23 00:11:22 +0100
committerIb Lundgren <ib.lundgren@gmail.com>2012-11-23 00:11:22 +0100
commitd421d34541e2b2b35413f941c1c1e60a1e679ae5 (patch)
tree156baae52ceba67a4180e290aba3a814caa1bb67
parent3bcbb25f6b15d23fe79de34389363b0c5f078a82 (diff)
downloadoauthlib-d421d34541e2b2b35413f941c1c1e60a1e679ae5.tar.gz
A batch of small fixes and cleanups.
-rw-r--r--oauthlib/common.py8
-rw-r--r--oauthlib/oauth2/draft25/__init__.py29
-rw-r--r--oauthlib/oauth2/draft25/grant_types.py7
-rw-r--r--oauthlib/oauth2/draft25/tokens.py7
-rw-r--r--tests/oauth2/draft25/test_grant_types.py2
-rw-r--r--tests/oauth2/draft25/test_server.py62
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