Ookay, last reshuffle.

 * openstack.NewClient() normalizes the identity endpoint with a trailing slash, and sets base and endpoint.
 * utils.ChooseVersion() checks suffixes first to short-circuit actual version calls.
 * gophercloud.ProviderClient distinguishes between the root of all identity services (IdentityBase)
   and the endpoint of the requested auth service (IdentityEndpoint).
diff --git a/openstack/utils/client.go b/openstack/utils/client.go
index 7e3aa12..f8a6c57 100644
--- a/openstack/utils/client.go
+++ b/openstack/utils/client.go
@@ -47,7 +47,7 @@
 		Options: ao,
 	}
 
-	c := &gophercloud.ServiceClient{Endpoint: ao.IdentityEndpoint}
+	c := &gophercloud.ServiceClient{Endpoint: ao.IdentityEndpoint + "/"}
 	ar, err := identity.Authenticate(c, ao)
 	if err != nil {
 		return client, err