func GetOauth2Client(clientId, clientSecret, cachePath string, promptUser bool) (*http.Client, error) { cacheFile := oauth.CacheFile(cachePath) config := &oauth.Config{ ClientId: clientId, ClientSecret: clientSecret, Scope: "https://www.googleapis.com/auth/drive", RedirectURL: "urn:ietf:wg:oauth:2.0:oob", AuthURL: "https://accounts.google.com/o/oauth2/auth", TokenURL: "https://accounts.google.com/o/oauth2/token", TokenCache: cacheFile, } transport := &oauth.Transport{ Config: config, Transport: http.DefaultTransport, } // Return client if we have a valid token if hasValidToken(cacheFile, transport) { return transport.Client(), nil } if !promptUser { return nil, errors.New("no valid token found") } // Get auth code from user and request a new token code := promptUserForAuthCode(config) _, err := transport.Exchange(code) if err != nil { return nil, err } return transport.Client(), nil }
func main() { flag.Parse() // Set up a configuration. config := &oauth.Config{ ClientId: *clientId, ClientSecret: *clientSecret, RedirectURL: *redirectURL, Scope: *scope, AuthURL: *authURL, TokenURL: *tokenURL, TokenCache: oauth.CacheFile(*cachefile), } // Set up a Transport using the config. transport := &oauth.Transport{Config: config} // Try to pull the token from the cache; if this fails, we need to get one. token, err := config.TokenCache.Token() if err != nil { if *clientId == "" || *clientSecret == "" { flag.Usage() fmt.Fprint(os.Stderr, usageMsg) os.Exit(2) } if *code == "" { // Get an authorization code from the data provider. // ("Please ask the user if I can access this resource.") url := config.AuthCodeURL("") fmt.Print("Visit this URL to get a code, then run again with -code=YOUR_CODE\n\n") fmt.Println(url) return } // Exchange the authorization code for an access token. // ("Here's the code you gave the user, now give me a token!") token, err = transport.Exchange(*code) if err != nil { log.Fatal("Exchange:", err) } // (The Exchange method will automatically cache the token.) fmt.Printf("Token is cached in %v\n", config.TokenCache) } // Make the actual request using the cached token to authenticate. // ("Here's the token, let me in!") transport.Token = token // Make the request. r, err := transport.Client().Get(*requestURL) if err != nil { log.Fatal("Get:", err) } defer r.Body.Close() // Write the response to standard output. io.Copy(os.Stdout, r.Body) // Send final carriage return, just to be neat. fmt.Println() }