From 6a273d678b23b63845e636c0ed6550ce0c23616a Mon Sep 17 00:00:00 2001 From: Eddie Warner Date: Tue, 1 Mar 2016 12:05:18 -0800 Subject: [PATCH] Expand API for step2_exchange In python 3, the code received from the browser will be binary instead of a string. Expand the API for oauth_flow.step2_exchange(code) to allow this value to be passed as is rather than decoding. for example: credentials = self.flow.step2_exchange(b'some random code') test: tox -e py34 -- tests.test_client:OAuth2WebServerFlowTest.test_exchange_success_binary_code resolves: #443, #446 --- oauth2client/client.py | 2 +- tests/test_client.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/oauth2client/client.py b/oauth2client/client.py index a388fb88e..4897665e7 100644 --- a/oauth2client/client.py +++ b/oauth2client/client.py @@ -2069,7 +2069,7 @@ def step2_exchange(self, code=None, http=None, device_flow_info=None): if code is None: code = device_flow_info.device_code - elif not isinstance(code, six.string_types): + elif not isinstance(code, (six.string_types, six.binary_type)): if 'code' not in code: raise FlowExchangeError(code.get( 'error', 'No code was supplied in the query parameters.')) diff --git a/tests/test_client.py b/tests/test_client.py index 03b30fbb5..684f7bdb5 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -79,6 +79,7 @@ from oauth2client.client import save_to_well_known_file from oauth2client.clientsecrets import _loadfile from oauth2client.service_account import ServiceAccountCredentials +from oauth2client._helpers import _to_bytes __author__ = 'jcgregorio@google.com (Joe Gregorio)' @@ -1201,6 +1202,26 @@ def test_exchange_success(self): self.assertEqual('dummy_revoke_uri', credentials.revoke_uri) self.assertEqual(set(['foo']), credentials.scopes) + def test_exchange_success_binary_code(self): + binary_code = b'some random code' + access_token = 'SlAV32hkKG' + expires_in = '3600' + refresh_token = '8xLOxBtZp8' + revoke_uri = 'dummy_revoke_uri' + + payload = ('{' + ' "access_token":"' + access_token + '",' + ' "expires_in":' + expires_in + ',' + ' "refresh_token":"' + refresh_token + '"' + '}') + http = HttpMockSequence([({'status': '200'}, _to_bytes(payload))]) + credentials = self.flow.step2_exchange(binary_code, http=http) + self.assertEqual(access_token, credentials.access_token) + self.assertIsNotNone(credentials.token_expiry) + self.assertEqual(refresh_token, credentials.refresh_token) + self.assertEqual(revoke_uri, credentials.revoke_uri) + self.assertEqual(set(['foo']), credentials.scopes) + def test_exchange_dictlike(self): class FakeDict(object): def __init__(self, d):