Merge "services/identity: Switch from code.google.com/p/oauth to golang.org/x/oauth2."
diff --git a/services/identity/oauth/googleoauth.go b/services/identity/oauth/googleoauth.go
index 580dfb0..5feb74e 100644
--- a/services/identity/oauth/googleoauth.go
+++ b/services/identity/oauth/googleoauth.go
@@ -1,9 +1,9 @@
package oauth
import (
- "code.google.com/p/goauth2/oauth"
"encoding/json"
"fmt"
+ "golang.org/x/oauth2"
"net/http"
"os"
@@ -46,15 +46,20 @@
// tokeninfo API to extract the email address from that token.
func (g *googleOAuth) ExchangeAuthCodeForEmail(authcode string, url string) (string, error) {
config := g.oauthConfig(url)
- t, err := (&oauth.Transport{Config: config}).Exchange(authcode)
+ t, err := config.Exchange(oauth2.NoContext, authcode)
if err != nil {
return "", fmt.Errorf("failed to exchange authorization code for token: %v", err)
}
+
+ if !t.Valid() {
+ return "", fmt.Errorf("oauth2 token invalid")
+ }
// Ideally, would validate the token ourselves without an HTTP roundtrip.
// However, for now, as per:
// https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
// pay an HTTP round-trip to have Google do this.
- if t.Extra == nil || len(t.Extra["id_token"]) == 0 {
+ idToken, ok := t.Extra("id_token").(string)
+ if !ok {
return "", fmt.Errorf("no GoogleIDToken found in OAuth token")
}
// The GoogleIDToken is currently validated by sending an HTTP request to
@@ -63,7 +68,7 @@
// of traffic. If either is a concern, the GoogleIDToken can be validated
// without an additional HTTP request.
// See: https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
- tinfo, err := http.Get(g.verifyURL + "id_token=" + t.Extra["id_token"])
+ tinfo, err := http.Get(g.verifyURL + "id_token=" + idToken)
if err != nil {
return "", fmt.Errorf("failed to talk to GoogleIDToken verifier (%q): %v", g.verifyURL, err)
}
@@ -80,7 +85,7 @@
if gtoken.Issuer != "accounts.google.com" {
return "", fmt.Errorf("invalid issuer: %v", gtoken.Issuer)
}
- if gtoken.Audience != config.ClientId {
+ if gtoken.Audience != config.ClientID {
return "", fmt.Errorf("unexpected audience(%v) in GoogleIDToken", gtoken.Audience)
}
return gtoken.Email, nil
@@ -135,14 +140,16 @@
return token.Email, client.Name, nil
}
-func (g *googleOAuth) oauthConfig(redirectUrl string) *oauth.Config {
- return &oauth.Config{
- ClientId: g.clientID,
+func (g *googleOAuth) oauthConfig(redirectUrl string) *oauth2.Config {
+ return &oauth2.Config{
+ ClientID: g.clientID,
ClientSecret: g.clientSecret,
RedirectURL: redirectUrl,
- Scope: g.scope,
- AuthURL: g.authURL,
- TokenURL: g.tokenURL,
+ Scopes: []string{g.scope},
+ Endpoint: oauth2.Endpoint{
+ AuthURL: g.authURL,
+ TokenURL: g.tokenURL,
+ },
}
}