Using `six.raise_from` wherever possible.
diff --git a/google/auth/_default.py b/google/auth/_default.py
index 7dac642..06f52bb 100644
--- a/google/auth/_default.py
+++ b/google/auth/_default.py
@@ -22,6 +22,8 @@
 import logging
 import os
 
+import six
+
 from google.auth import environment_vars
 from google.auth import exceptions
 import google.auth.transport._http_client
@@ -67,9 +69,10 @@
     with io.open(filename, 'r') as file_obj:
         try:
             info = json.load(file_obj)
-        except ValueError as exc:
-            raise exceptions.DefaultCredentialsError(
-                'File {} is not a valid json file.'.format(filename), exc)
+        except ValueError as caught_exc:
+            new_exc = exceptions.DefaultCredentialsError(
+                'File {} is not a valid json file.'.format(filename))
+            six.raise_from(new_exc, caught_exc)
 
     # The type key should indicate that the file is either a service account
     # credentials file or an authorized user credentials file.
@@ -80,10 +83,11 @@
 
         try:
             credentials = _cloud_sdk.load_authorized_user_credentials(info)
-        except ValueError as exc:
-            raise exceptions.DefaultCredentialsError(
+        except ValueError as caught_exc:
+            new_exc = exceptions.DefaultCredentialsError(
                 'Failed to load authorized user credentials from {}'.format(
-                    filename), exc)
+                    filename))
+            six.raise_from(new_exc, caught_exc)
         # Authorized user credentials do not contain the project ID.
         return credentials, None
 
@@ -93,10 +97,11 @@
         try:
             credentials = (
                 service_account.Credentials.from_service_account_info(info))
-        except ValueError as exc:
-            raise exceptions.DefaultCredentialsError(
+        except ValueError as caught_exc:
+            new_exc = exceptions.DefaultCredentialsError(
                 'Failed to load service account credentials from {}'.format(
-                    filename), exc)
+                    filename))
+            six.raise_from(new_exc, caught_exc)
         return credentials, info.get('project_id')
 
     else:
diff --git a/google/auth/_oauth2client.py b/google/auth/_oauth2client.py
index 312326e..e298fb1 100644
--- a/google/auth/_oauth2client.py
+++ b/google/auth/_oauth2client.py
@@ -26,12 +26,14 @@
 import google.oauth2.credentials
 import google.oauth2.service_account
 
+import six
 try:
     import oauth2client.client
     import oauth2client.contrib.gce
     import oauth2client.service_account
-except ImportError:
-    raise ImportError('oauth2client is not installed.')
+except ImportError as caught_exc:
+    new_exc = ImportError('oauth2client is not installed.')
+    six.raise_from(new_exc, caught_exc)
 
 try:
     import oauth2client.contrib.appengine
@@ -162,5 +164,6 @@
 
     try:
         return _CLASS_CONVERSION_MAP[credentials_class](credentials)
-    except KeyError:
-        raise ValueError(_CONVERT_ERROR_TMPL.format(credentials_class))
+    except KeyError as caught_exc:
+        new_exc = ValueError(_CONVERT_ERROR_TMPL.format(credentials_class))
+        six.raise_from(new_exc, caught_exc)
diff --git a/google/auth/compute_engine/_metadata.py b/google/auth/compute_engine/_metadata.py
index 9a22d7a..c47be3f 100644
--- a/google/auth/compute_engine/_metadata.py
+++ b/google/auth/compute_engine/_metadata.py
@@ -22,6 +22,7 @@
 import logging
 import os
 
+import six
 from six.moves import http_client
 from six.moves.urllib import parse as urlparse
 
@@ -118,10 +119,11 @@
         if response.headers['content-type'] == 'application/json':
             try:
                 return json.loads(content)
-            except ValueError:
-                raise exceptions.TransportError(
+            except ValueError as caught_exc:
+                new_exc = exceptions.TransportError(
                     'Received invalid JSON from the Google Compute Engine'
                     'metadata service: {:.20}'.format(content))
+                six.raise_from(new_exc, caught_exc)
         else:
             return content
     else:
diff --git a/google/auth/compute_engine/credentials.py b/google/auth/compute_engine/credentials.py
index b8fe6f5..cbc7cf4 100644
--- a/google/auth/compute_engine/credentials.py
+++ b/google/auth/compute_engine/credentials.py
@@ -19,6 +19,8 @@
 
 """
 
+import six
+
 from google.auth import credentials
 from google.auth import exceptions
 from google.auth.compute_engine import _metadata
@@ -89,8 +91,9 @@
             self.token, self.expiry = _metadata.get_service_account_token(
                 request,
                 service_account=self._service_account_email)
-        except exceptions.TransportError as exc:
-            raise exceptions.RefreshError(exc)
+        except exceptions.TransportError as caught_exc:
+            new_exc = exceptions.RefreshError()
+            six.raise_from(new_exc, caught_exc)
 
     @property
     def service_account_email(self):
diff --git a/google/auth/jwt.py b/google/auth/jwt.py
index b1eb5fb..0253376 100644
--- a/google/auth/jwt.py
+++ b/google/auth/jwt.py
@@ -47,6 +47,7 @@
 import json
 
 import cachetools
+import six
 from six.moves import urllib
 
 from google.auth import _helpers
@@ -101,8 +102,9 @@
     section_bytes = _helpers.padded_urlsafe_b64decode(encoded_section)
     try:
         return json.loads(section_bytes.decode('utf-8'))
-    except ValueError:
-        raise ValueError('Can\'t parse segment: {0}'.format(section_bytes))
+    except ValueError as caught_exc:
+        new_exc = ValueError('Can\'t parse segment: {0}'.format(section_bytes))
+        six.raise_from(new_exc, caught_exc)
 
 
 def _unverified_decode(token):
diff --git a/google/auth/transport/_http_client.py b/google/auth/transport/_http_client.py
index 4a10096..35b1005 100644
--- a/google/auth/transport/_http_client.py
+++ b/google/auth/transport/_http_client.py
@@ -17,6 +17,7 @@
 import logging
 import socket
 
+import six
 from six.moves import http_client
 from six.moves import urllib
 
@@ -104,8 +105,9 @@
             response = connection.getresponse()
             return Response(response)
 
-        except (http_client.HTTPException, socket.error) as exc:
-            raise exceptions.TransportError(exc)
+        except (http_client.HTTPException, socket.error) as caught_exc:
+            new_exc = exceptions.TransportError()
+            six.raise_from(new_exc, caught_exc)
 
         finally:
             connection.close()
diff --git a/google/auth/transport/grpc.py b/google/auth/transport/grpc.py
index 8554ffa..08b2f57 100644
--- a/google/auth/transport/grpc.py
+++ b/google/auth/transport/grpc.py
@@ -16,13 +16,14 @@
 
 from __future__ import absolute_import
 
+import six
 try:
     import grpc
-except ImportError:  # pragma: NO COVER
-    raise ImportError(
+except ImportError as caught_exc:  # pragma: NO COVER
+    new_exc = ImportError(
         'gRPC is not installed, please install the grpcio package to use the '
         'gRPC transport.')
-import six
+    six.raise_from(new_exc, caught_exc)
 
 
 class AuthMetadataPlugin(grpc.AuthMetadataPlugin):
diff --git a/google/auth/transport/requests.py b/google/auth/transport/requests.py
index 6fc395e..31ce22d 100644
--- a/google/auth/transport/requests.py
+++ b/google/auth/transport/requests.py
@@ -18,12 +18,14 @@
 
 import logging
 
+import six
 try:
     import requests
-except ImportError:  # pragma: NO COVER
-    raise ImportError(
+except ImportError as caught_exc:  # pragma: NO COVER
+    new_exc = ImportError(
         'The requests library is not installed, please install the requests '
         'package to use the requests transport.')
+    six.raise_from(new_exc, caught_exc)
 import requests.exceptions
 
 from google.auth import exceptions
@@ -111,8 +113,9 @@
                 method, url, data=body, headers=headers, timeout=timeout,
                 **kwargs)
             return _Response(response)
-        except requests.exceptions.RequestException as exc:
-            raise exceptions.TransportError(exc)
+        except requests.exceptions.RequestException as caught_exc:
+            new_exc = exceptions.TransportError()
+            six.raise_from(new_exc, caught_exc)
 
 
 class AuthorizedSession(requests.Session):
diff --git a/google/auth/transport/urllib3.py b/google/auth/transport/urllib3.py
index 0dfe913..872bf9f 100644
--- a/google/auth/transport/urllib3.py
+++ b/google/auth/transport/urllib3.py
@@ -30,12 +30,14 @@
 except ImportError:  # pragma: NO COVER
     certifi = None
 
+import six
 try:
     import urllib3
-except ImportError:  # pragma: NO COVER
-    raise ImportError(
+except ImportError as caught_exc:  # pragma: NO COVER
+    new_exc = ImportError(
         'The urllib3 library is not installed, please install the urllib3 '
         'package to use the urllib3 transport.')
+    six.raise_from(new_exc, caught_exc)
 import urllib3.exceptions
 
 from google.auth import exceptions
@@ -126,8 +128,9 @@
             response = self.http.request(
                 method, url, body=body, headers=headers, **kwargs)
             return _Response(response)
-        except urllib3.exceptions.HTTPError as exc:
-            raise exceptions.TransportError(exc)
+        except urllib3.exceptions.HTTPError as caught_exc:
+            new_exc = exceptions.TransportError()
+            six.raise_from(new_exc, caught_exc)
 
 
 def _make_default_http():
diff --git a/google/oauth2/_client.py b/google/oauth2/_client.py
index 468cb7e..66251df 100644
--- a/google/oauth2/_client.py
+++ b/google/oauth2/_client.py
@@ -26,6 +26,7 @@
 import datetime
 import json
 
+import six
 from six.moves import http_client
 from six.moves import urllib
 
@@ -144,9 +145,10 @@
 
     try:
         access_token = response_data['access_token']
-    except KeyError:
-        raise exceptions.RefreshError(
+    except KeyError as caught_exc:
+        new_exc = exceptions.RefreshError(
             'No access token in response.', response_data)
+        six.raise_from(new_exc, caught_exc)
 
     expiry = _parse_expiry(response_data)
 
@@ -190,9 +192,10 @@
 
     try:
         access_token = response_data['access_token']
-    except KeyError:
-        raise exceptions.RefreshError(
+    except KeyError as caught_exc:
+        new_exc = exceptions.RefreshError(
             'No access token in response.', response_data)
+        six.raise_from(new_exc, caught_exc)
 
     refresh_token = response_data.get('refresh_token', refresh_token)
     expiry = _parse_expiry(response_data)
diff --git a/tests/compute_engine/test_credentials.py b/tests/compute_engine/test_credentials.py
index ae2597d..ee343fe 100644
--- a/tests/compute_engine/test_credentials.py
+++ b/tests/compute_engine/test_credentials.py
@@ -78,8 +78,6 @@
         with pytest.raises(exceptions.RefreshError) as excinfo:
             self.credentials.refresh(None)
 
-        assert excinfo.match(r'http error')
-
     @mock.patch('google.auth.compute_engine._metadata.get', autospec=True)
     def test_before_request_refreshes(self, get):
         get.side_effect = [{
diff --git a/tests/test__default.py b/tests/test__default.py
index 2df8a44..090cea6 100644
--- a/tests/test__default.py
+++ b/tests/test__default.py
@@ -85,7 +85,6 @@
         _default._load_credentials_from_file(str(filename))
 
     assert excinfo.match(r'Failed to load authorized user')
-    assert excinfo.match(r'missing fields')
 
 
 def test__load_credentials_from_file_service_account():
@@ -103,7 +102,6 @@
         _default._load_credentials_from_file(str(filename))
 
     assert excinfo.match(r'Failed to load service account')
-    assert excinfo.match(r'missing fields')
 
 
 @mock.patch.dict(os.environ, {}, clear=True)