google: make JWTConfigFromJSON set TokenURL from the JSON's token_uri

Fixes golang/oauth2#199.

Change-Id: I534def935c7143e4276b5d880127b0af35409f9a
Reviewed-on: https://go-review.googlesource.com/28411
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/google/google.go b/google/google.go
index 82399b0..a48d5bf 100644
--- a/google/google.go
+++ b/google/google.go
@@ -89,6 +89,7 @@
 		Email        string `json:"client_email"`
 		PrivateKey   string `json:"private_key"`
 		PrivateKeyID string `json:"private_key_id"`
+		TokenURL     string `json:"token_uri"`
 	}
 	if err := json.Unmarshal(jsonKey, &key); err != nil {
 		return nil, err
@@ -98,7 +99,10 @@
 		PrivateKey:   []byte(key.PrivateKey),
 		PrivateKeyID: key.PrivateKeyID,
 		Scopes:       scope,
-		TokenURL:     JWTTokenURL,
+		TokenURL:     key.TokenURL,
+	}
+	if config.TokenURL == "" {
+		config.TokenURL = JWTTokenURL
 	}
 	return config, nil
 }
diff --git a/google/google_test.go b/google/google_test.go
index 3046b05..287c699 100644
--- a/google/google_test.go
+++ b/google/google_test.go
@@ -36,6 +36,15 @@
   "private_key": "super secret key",
   "client_email": "gopher@developer.gserviceaccount.com",
   "client_id": "gopher.apps.googleusercontent.com",
+  "token_uri": "https://accounts.google.com/o/gophers/token",
+  "type": "service_account"
+}`)
+
+var jwtJSONKeyNoTokenURL = []byte(`{
+  "private_key_id": "268f54e43a1af97cfc71731688434f45aca15c8b",
+  "private_key": "super secret key",
+  "client_email": "gopher@developer.gserviceaccount.com",
+  "client_id": "gopher.apps.googleusercontent.com",
   "type": "service_account"
 }`)
 
@@ -91,6 +100,16 @@
 	if got, want := strings.Join(conf.Scopes, ","), "scope1,scope2"; got != want {
 		t.Errorf("Scopes = %q; want %q", got, want)
 	}
+	if got, want := conf.TokenURL, "https://accounts.google.com/o/gophers/token"; got != want {
+		t.Errorf("TokenURL = %q; want %q", got, want)
+	}
+}
+
+func TestJWTConfigFromJSONNoTokenURL(t *testing.T) {
+	conf, err := JWTConfigFromJSON(jwtJSONKeyNoTokenURL, "scope1", "scope2")
+	if err != nil {
+		t.Fatal(err)
+	}
 	if got, want := conf.TokenURL, "https://accounts.google.com/o/oauth2/token"; got != want {
 		t.Errorf("TokenURL = %q; want %q", got, want)
 	}