aboutsummaryrefslogtreecommitdiffstats
path: root/auth/auth.go
diff options
context:
space:
mode:
Diffstat (limited to 'auth/auth.go')
-rw-r--r--auth/auth.go68
1 files changed, 68 insertions, 0 deletions
diff --git a/auth/auth.go b/auth/auth.go
new file mode 100644
index 0000000..c4a67e3
--- /dev/null
+++ b/auth/auth.go
@@ -0,0 +1,68 @@
+package auth
+
+import (
+ "net/http"
+ "fmt"
+ "code.google.com/p/goauth2/oauth"
+ "../util"
+)
+
+// Get auth code from user
+func promptUserForAuthCode(config *oauth.Config) string {
+ authUrl := config.AuthCodeURL("state")
+ fmt.Println("Go to the following link in your browser:")
+ fmt.Printf("%v\n\n", authUrl)
+ return util.Prompt("Enter verification code: ")
+}
+
+// Returns true if we have a valid cached token
+func hasValidToken(cacheFile oauth.CacheFile, transport *oauth.Transport) bool {
+ // Check if we have a cached token
+ token, err := cacheFile.Token()
+ if err != nil {
+ return false
+ }
+
+ // Refresh token if its expired
+ if token.Expired() {
+ transport.Token = token
+ err = transport.Refresh()
+ if err != nil {
+ fmt.Println(err)
+ return false
+ }
+ }
+ return true
+}
+
+func GetOauth2Client(clientId, clientSecret, cachePath string) (*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
+ }
+
+ // 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
+}