Repository: GoogleCloudPlatform/google-auth-library-python
Pull request #110 (2017-02-16 00:48:47)

Add public property google.auth.credentials.Signing.signer


Patch:
diff --git a/google/auth/app_engine.py b/google/auth/app_engine.py
index 8b17e76..e6e84d2 100644
--- a/google/auth/app_engine.py
+++ b/google/auth/app_engine.py
@@ -123,6 +123,7 @@ class Credentials(credentials.Scoped, credentials.Signing,
         super(Credentials, self).__init__()
         self._scopes = scopes
         self._service_account_id = service_account_id
+        self._signer = Signer()
 
     @_helpers.copy_docstring(credentials.Credentials)
     def refresh(self, request):
@@ -156,9 +157,14 @@ class Credentials(credentials.Scoped, credentials.Signing,
 
     @_helpers.copy_docstring(credentials.Signing)
     def sign_bytes(self, message):
-        return Signer().sign(message)
+        return self._signer.sign(message)
 
     @property
     @_helpers.copy_docstring(credentials.Signing)
     def signer_email(self):
         return self.service_account_email
+
+    @property
+    @_helpers.copy_docstring(credentials.Signing)
+    def signer(self):
+        return self._signer
diff --git a/google/auth/credentials.py b/google/auth/credentials.py
index 360dc0e..2358b1d 100644
--- a/google/auth/credentials.py
+++ b/google/auth/credentials.py
@@ -236,3 +236,10 @@ class Signing(object):
         # pylint: disable=missing-raises-doc
         # (pylint doesn't recognize that this is abstract)
         raise NotImplementedError('Signer email must be implemented.')
+
+    @abc.abstractproperty
+    def signer(self):
+        """google.auth.crypt.Signer: The signer used to sign bytes."""
+        # pylint: disable=missing-raises-doc
+        # (pylint doesn't recognize that this is abstract)
+        raise NotImplementedError('Signer must be implemented.')
diff --git a/google/auth/jwt.py b/google/auth/jwt.py
index dfaf2e6..418be6b 100644
--- a/google/auth/jwt.py
+++ b/google/auth/jwt.py
@@ -468,6 +468,11 @@ class Credentials(credentials.Signing,
     def signer_email(self):
         return self._issuer
 
+    @property
+    @_helpers.copy_docstring(credentials.Signing)
+    def signer(self):
+        return self._signer
+
     def before_request(self, request, method, url, headers):
         """Performs credential-specific before request logic.
 
diff --git a/google/oauth2/service_account.py b/google/oauth2/service_account.py
index 48b537d..b71b8ac 100644
--- a/google/oauth2/service_account.py
+++ b/google/oauth2/service_account.py
@@ -318,6 +318,11 @@ class Credentials(credentials.Signing,
     def sign_bytes(self, message):
         return self._signer.sign(message)
 
+    @property
+    @_helpers.copy_docstring(credentials.Signing)
+    def signer(self):
+        return self._signer
+
     @property
     @_helpers.copy_docstring(credentials.Signing)
     def signer_email(self):


Test patch:
diff --git a/tests/oauth2/test_service_account.py b/tests/oauth2/test_service_account.py
index e6ce631..f40ebf2 100644
--- a/tests/oauth2/test_service_account.py
+++ b/tests/oauth2/test_service_account.py
@@ -134,6 +134,9 @@ class TestCredentials(object):
         signature = self.credentials.sign_bytes(to_sign)
         assert crypt.verify_signature(to_sign, signature, PUBLIC_CERT_BYTES)
 
+    def test_signer(self):
+        assert isinstance(self.credentials.signer, crypt.Signer)
+
     def test_signer_email(self):
         assert self.credentials.signer_email == self.SERVICE_ACCOUNT_EMAIL
 
diff --git a/tests/test_app_engine.py b/tests/test_app_engine.py
index dd410d9..af60bcf 100644
--- a/tests/test_app_engine.py
+++ b/tests/test_app_engine.py
@@ -139,6 +139,10 @@ class TestCredentials(object):
         assert signature == mock.sentinel.signature
         app_identity_mock.sign_blob.assert_called_with(to_sign)
 
+    def test_signer(self, app_identity_mock):
+        credentials = app_engine.Credentials()
+        assert isinstance(credentials.signer, app_engine.Signer)
+
     def test_signer_email(self, app_identity_mock):
         credentials = app_engine.Credentials()
         assert credentials.signer_email == credentials.service_account_email
diff --git a/tests/test_jwt.py b/tests/test_jwt.py
index 3959260..e4a9a0a 100644
--- a/tests/test_jwt.py
+++ b/tests/test_jwt.py
@@ -264,6 +264,9 @@ class TestCredentials:
         signature = self.credentials.sign_bytes(to_sign)
         assert crypt.verify_signature(to_sign, signature, PUBLIC_CERT_BYTES)
 
+    def test_signer(self):
+        assert isinstance(self.credentials.signer, crypt.Signer)
+
     def test_signer_email(self):
         assert (self.credentials.signer_email ==
                 SERVICE_ACCOUNT_INFO['client_email'])