Skip to content

Instantly share code, notes, and snippets.

@natemurthy
Created November 10, 2022 01:06
Show Gist options
  • Save natemurthy/9fd531dab0f7be40ad5065292b4f6f89 to your computer and use it in GitHub Desktop.
Save natemurthy/9fd531dab0f7be40ad5065292b4f6f89 to your computer and use it in GitHub Desktop.
Etrade API oauth1 flow using Go
package main
import (
"bufio"
"fmt"
"log"
"net/url"
"os"
"strings"
"github.com/dghubble/oauth1"
)
var (
consumerKey = os.Getenv("CONSUMER_KEY")
consumerSecret = os.Getenv("CONSUMER_SECRET")
)
// GenerateAuthURL derived from config.AuthorizationURL but slightly tuned
// to fit the shape of the Etrade API
func GenerateAuthURL(token, key, baseAuthURL string) (*url.URL, error) {
authorizationURL, err := url.Parse(baseAuthURL)
if err != nil {
return nil, err
}
values := authorizationURL.Query()
values.Add("key", key)
values.Add("token", token)
authorizationURL.RawQuery = values.Encode()
return authorizationURL, nil
}
func main() {
var endpoint oauth1.Endpoint
endpoint.RequestTokenURL = "https://apisb.etrade.com/oauth/request_token"
endpoint.AuthorizeURL = "https://us.etrade.com/e/t/etws/authorize"
endpoint.AccessTokenURL = "https://apisb.etrade.com/oauth/access_token"
config := oauth1.NewConfig(consumerKey, consumerSecret)
config.Endpoint = endpoint
config.CallbackURL = "oob"
requestToken, requestTokenSecret, err := config.RequestToken()
if err != nil {
log.Fatal(err)
}
authURL, err := GenerateAuthURL(requestToken, consumerKey, endpoint.AuthorizeURL)
if err != nil {
log.Fatal(err)
}
fmt.Println(authURL.String())
fmt.Print("Enter oauth_verifier: ")
reader := bufio.NewReader(os.Stdin)
// ReadString will block until the delimiter is entered
verifierCode, err := reader.ReadString('\n')
if err != nil {
log.Fatalf("An error occurred while reading input. Please try again: %v", err)
}
verifierCode = strings.TrimSuffix(verifierCode, "\n")
accessToken, accessSecret, err := config.AccessToken(requestToken, requestTokenSecret, verifierCode)
if err != nil {
log.Fatal(err)
}
fmt.Println(accessToken)
fmt.Println(accessSecret)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment