Introduce the save_to_well_known_file() method.

This commit is contained in:
Orest Bolohan
2014-07-17 16:06:35 -07:00
parent 9316f50796
commit b47dc9b140
7 changed files with 96 additions and 8 deletions

View File

@@ -197,6 +197,10 @@ class AppAssertionCredentials(AssertionCredentials):
raise AccessTokenRefreshError(str(e))
self.access_token = token
@property
def serialization_data(self):
raise NotImplementedError('Cannot serialize credentials for AppEngine.')
def create_scoped_required(self):
return not self.scope

View File

@@ -985,6 +985,16 @@ class GoogleCredentials(OAuth2Credentials):
"""
return self
@property
def serialization_data(self):
"""Get the fields and their values identifying the current credentials."""
return {
'type': 'authorized_user',
'client_id': self.client_id,
'client_secret': self.client_secret,
'refresh_token': self.refresh_token
}
@staticmethod
def get_application_default():
"""Get the Application Default Credentials for the current environment.
@@ -1004,6 +1014,8 @@ class GoogleCredentials(OAuth2Credentials):
else:
application_default_credential_filename = _get_environment_variable_file()
well_known_file = _get_well_known_file()
if not os.path.isfile(well_known_file):
well_known_file = None
if application_default_credential_filename:
try:
@@ -1064,6 +1076,26 @@ class GoogleCredentials(OAuth2Credentials):
'method should point to a file.')
def save_to_well_known_file(credentials, well_known_file=None):
"""Save the provided GoogleCredentials to the well known file.
Args:
credentials:
the credentials to be saved to the well known file;
it should be an instance of GoogleCredentials
well_known_file:
the name of the file where the credentials are to be saved;
this parameter is supposed to be used for testing only
"""
if well_known_file is None:
well_known_file = _get_well_known_file()
credentials_data = credentials.serialization_data
with open(well_known_file, 'w') as f:
simplejson.dump(credentials_data, f, sort_keys=True, indent=2)
def _get_environment_variable_file():
application_default_credential_filename = (
os.environ.get(GOOGLE_APPLICATION_CREDENTIALS,
@@ -1103,8 +1135,7 @@ def _get_well_known_file():
default_config_path = os.path.join(default_config_path,
WELL_KNOWN_CREDENTIALS_FILE)
if os.path.isfile(default_config_path):
return default_config_path
return default_config_path
def _get_application_default_credential_from_file(

View File

@@ -93,6 +93,11 @@ class AppAssertionCredentials(AssertionCredentials):
' with no service account or scopes.')
raise AccessTokenRefreshError(content)
@property
def serialization_data(self):
raise NotImplementedError(
'Cannot serialize credentials for GCE service accounts.')
def create_scoped_required(self):
return not self.scope

View File

@@ -92,6 +92,16 @@ class _ServiceAccountCredentials(AssertionCredentials):
def service_account_email(self):
return self._service_account_email
@property
def serialization_data(self):
return {
'type': 'service_account',
'client_id': self._service_account_id,
'client_email': self._service_account_email,
'private_key_id': self._private_key_id,
'private_key': self._private_key_pkcs8_text
}
def create_scoped_required(self):
return not self._scopes

View File

@@ -69,6 +69,7 @@ from oauth2client.client import Credentials
from oauth2client.client import FlowExchangeError
from oauth2client.client import OAuth2Credentials
from oauth2client.client import flow_from_clientsecrets
from oauth2client.client import save_to_well_known_file
from webtest import TestApp
@@ -248,6 +249,10 @@ class TestAppAssertionCredentials(unittest.TestCase):
self.assertEqual('a_token_123', token.access_token)
self.assertEqual(None, token.expires_in)
def test_save_to_well_known_file(self):
credentials = AppAssertionCredentials([])
self.assertRaises(NotImplementedError, save_to_well_known_file, credentials)
class TestFlowModel(db.Model):
flow = FlowProperty()

View File

@@ -26,6 +26,7 @@ import unittest
from oauth2client.client import AccessTokenRefreshError
from oauth2client.client import Credentials
from oauth2client.client import save_to_well_known_file
from oauth2client.gce import AppAssertionCredentials
@@ -131,4 +132,7 @@ class AssertionCredentialsTests(unittest.TestCase):
m.UnsetStubs()
m.VerifyAll()
def test_save_to_well_known_file(self):
credentials = AppAssertionCredentials([])
self.assertRaises(NotImplementedError, save_to_well_known_file, credentials)

View File

@@ -67,6 +67,7 @@ from oauth2client.client import _update_query_params
from oauth2client.client import credentials_from_clientsecrets_and_code
from oauth2client.client import credentials_from_code
from oauth2client.client import flow_from_clientsecrets
from oauth2client.client import save_to_well_known_file
from oauth2client.clientsecrets import _loadfile
from oauth2client.service_account import _ServiceAccountCredentials
@@ -260,11 +261,6 @@ class GoogleCredentialsTests(unittest.TestCase):
os.environ['APPDATA'] = DATA_DIR
self.assertEqual(well_known_file, _get_well_known_file())
def test_get_well_known_file_on_windows_no_file(self):
os.name = 'nt'
os.environ['APPDATA'] = os.path.join(DATA_DIR, 'nonexistentpath')
self.assertEqual(None, _get_well_known_file())
def test_get_application_default_credential_from_file_service_account(self):
credentials_file = datafile(
os.path.join('gcloud', 'application_default_credentials.json'))
@@ -272,6 +268,22 @@ class GoogleCredentialsTests(unittest.TestCase):
credentials_file)
self.validate_service_account_credentials(credentials)
def test_save_to_well_known_file_service_account(self):
credential_file = datafile(
os.path.join('gcloud', 'application_default_credentials.json'))
credentials = _get_application_default_credential_from_file(
credential_file)
temp_credential_file = datafile(
os.path.join('gcloud', 'temp_well_known_file_service_account.json'))
save_to_well_known_file(credentials, temp_credential_file)
with open(temp_credential_file) as f:
d = simplejson.load(f)
self.assertEqual('service_account', d['type'])
self.assertEqual('123', d['client_id'])
self.assertEqual('dummy@google.com', d['client_email'])
self.assertEqual('ABCDEF', d['private_key_id'])
os.remove(temp_credential_file)
def test_get_application_default_credential_from_file_authorized_user(self):
credentials_file = datafile(
os.path.join('gcloud',
@@ -280,6 +292,23 @@ class GoogleCredentialsTests(unittest.TestCase):
credentials_file)
self.validate_google_credentials(credentials)
def test_save_to_well_known_file_authorized_user(self):
credentials_file = datafile(
os.path.join('gcloud',
'application_default_credentials_authorized_user.json'))
credentials = _get_application_default_credential_from_file(
credentials_file)
temp_credential_file = datafile(
os.path.join('gcloud', 'temp_well_known_file_authorized_user.json'))
save_to_well_known_file(credentials, temp_credential_file)
with open(temp_credential_file) as f:
d = simplejson.load(f)
self.assertEqual('authorized_user', d['type'])
self.assertEqual('123', d['client_id'])
self.assertEqual('secret', d['client_secret'])
self.assertEqual('alabalaportocala', d['refresh_token'])
os.remove(temp_credential_file)
def test_get_application_default_credential_from_malformed_file_1(self):
credentials_file = datafile(
os.path.join('gcloud',