diff --git a/reviewboard/settings.py b/reviewboard/settings.py
index de701436cf9f27c7234a39a6e4ea299cd3d21e6a..d3fc9cfa291b9a66ea99e89674f4f2336d917dec 100644
--- a/reviewboard/settings.py
+++ b/reviewboard/settings.py
@@ -205,7 +205,7 @@ WEB_API_ENCODERS = (
 
 # The backends that are used to authenticate requests against the web API.
 WEB_API_AUTH_BACKENDS = (
-    'djblets.webapi.auth.backends.basic.WebAPIBasicAuthBackend',
+    'reviewboard.webapi.auth_backends.WebAPIBasicAuthBackend',
     'djblets.webapi.auth.backends.api_tokens.WebAPITokenAuthBackend',
 )
 
diff --git a/reviewboard/webapi/auth_backends.py b/reviewboard/webapi/auth_backends.py
index a77fd144311148ae1ec0d9fe094034b080a1fd0d..dd04204c23e13d706ebcb844877582d0e3cc5ee0 100644
--- a/reviewboard/webapi/auth_backends.py
+++ b/reviewboard/webapi/auth_backends.py
@@ -1,5 +1,8 @@
 from __future__ import unicode_literals
 
+from django.contrib.auth.models import User
+from djblets.webapi.auth import (
+    WebAPIBasicAuthBackend as DjbletsWebAPIBasicAuthBackend)
 from djblets.webapi.auth.backends.api_tokens import TokenAuthBackendMixin
 
 from reviewboard.accounts.backends import AuthBackend
@@ -15,3 +18,43 @@ class TokenAuthBackend(TokenAuthBackendMixin, AuthBackend):
     """
 
     api_token_model = WebAPIToken
+
+
+class WebAPIBasicAuthBackend(DjbletsWebAPIBasicAuthBackend):
+    """A specialized WebAPI Basic auth backend that supports e-mail addresses.
+    """
+
+    def get_credentials(self, request):
+        """Return the credentials supplied in the request.
+
+        If the user provides an e-mail address as the username credential, it
+        will be translated to a username.
+
+        Args:
+            request (django.http.HttpRequest):
+                The request containing the credentials.
+
+        Returns:
+            dict:
+            A dictionary of the supplied credentials.
+        """
+        credentials = super(WebAPIBasicAuthBackend, self).get_credentials(
+            request)
+
+        user_exists = (
+            User.objects
+            .filter(username=credentials['username'])
+            .exists()
+        )
+
+        if not user_exists and '@' in credentials['username']:
+            users = (
+                User.objects
+                .filter(email=credentials['username'])
+                .values_list('username', flat=True)
+            )
+
+            if users:
+                credentials['username'] = users[0]
+
+    return credentials
