Adds saving the token to a file for reuse. Adds logging in via a webview

and reading the auth token out of the browser view to finish the auth
dance.
This commit is contained in:
Kevin Ruffin 2022-02-17 21:33:39 -05:00
parent f502f51e59
commit e3e6c2d0c4
2 changed files with 70 additions and 60 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.token

129
main.go
View File

@ -8,52 +8,46 @@ import (
// "fmt"
"log"
"net/http"
// "net/url"
"time"
"encoding/json"
"github.com/fatih/color"
//"github.com/skratchdot/open-golang/open"
//"github.com/mxschmitt/playwright-go"
"github.com/webview/webview"
"golang.org/x/oauth2"
"io/ioutil"
)
var (
conf *oauth2.Config
ctx context.Context
w webview.WebView
client *http.Client
)
// func callbackHandler(w http.ResponseWriter, r *http.Request) {
// queryParts, _ := url.ParseQuery(r.URL.RawQuery)
// // Use the authorization code that is pushed to the redirect
// // URL.
// code := queryParts["code"][0]
// log.Printf("code: %s\n", code)
func saveToken(tok *oauth2.Token, filename string) {
j, err := json.MarshalIndent(tok, "", "\t")
if err != nil {
log.Fatalf("Failed to save token: %v", err)
}
ioutil.WriteFile(filename, j, 0777)
}
// // Exchange will do the handshake to retrieve the initial access token.
// tok, err := conf.Exchange(ctx, code)
// if err != nil {
// log.Fatal(err)
// }
// log.Printf("Token: %s", tok)
// // The HTTP Client returned by conf.Client will refresh the token as necessary.
// client := conf.Client(ctx, tok)
func loadToken(filename string) *oauth2.Token {
data, err := ioutil.ReadFile(filename)
if err != nil {
return nil
}
// resp, err := client.Get("https://embed.gog.com/user/data/games")
// if err != nil {
// log.Fatal(err)
// } else {
// log.Println(color.CyanString("Authentication successful"))
// }
// defer resp.Body.Close()
var v = new(oauth2.Token)
err = json.Unmarshal(data, &v)
// // show succes page
// msg := "<p><strong>Success!</strong></p>"
// msg = msg + "<p>You are authenticated and can now return to the CLI.</p>"
// fmt.Fprintf(w, msg)
// }
if err != nil {
log.Fatalf("Failed to unmarshal data: %v", err)
}
return v
}
func giveCode(code string) {
log.Printf("Code: %s", code)
@ -63,8 +57,9 @@ func giveCode(code string) {
log.Fatal(err)
}
log.Printf("Token: %s", tok)
saveToken(tok, "./.token")
// The HTTP Client returned by conf.Client will refresh the token as necessary.
client := conf.Client(ctx, tok)
client = conf.Client(ctx, tok)
_, err = client.Get("https://embed.gog.com/user/data/games")
if err != nil {
@ -84,7 +79,7 @@ func giveCode(code string) {
`)
time.Sleep(1 * time.Second)
w.Destroy()
w.Terminate()
}
func openBrowser(url string) {
@ -105,33 +100,41 @@ func openBrowser(url string) {
w.Run()
}
// func plOpenBrowser(url string) {
// pw, err := playwright.Run()
// if err != nil {
// log.Fatalf("Could not start playwright: %v", err)
// }
type GameList struct {
owned []int64 `json:"owned"`
}
// browser, err := pw.Firefox.Launch()
// if err != nil {
// log.Fatalf("Could not launch browser: %v", err)
// }
func getGameList() *GameList {
res, err := client.Get("https://embed.gog.com/user/data/games")
if err != nil {
log.Fatalf("Failed to get game list: %v", err)
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatalf("Failed to parse game body: %v", err)
}
// page, err := browser.NewPage()
// if err != nil {
// log.Fatalf("Could not create page: %v", err)
// }
// _, err = page.Goto(url)
// if err != nil {
// log.Fatalf("Could not go to %s: %v", url, err)
// }
// log.Println("Opened the url")
// }
log.Println(string(body))
var gl = new(GameList)
err = json.Unmarshal(body, &gl)
if err != nil {
log.Fatalf("Failed to parse game list response: %v", err)
}
return gl
}
func login(url string) {
log.Println(color.CyanString("You will now be taken to your browser for authentication"))
time.Sleep(1 * time.Second)
openBrowser(url)
}
func main() {
ctx = context.Background()
conf = &oauth2.Config{
ClientID: "46899977096215655",
ClientSecret: "",
ClientSecret: "9d85c43b1482497dbbce61f6e4aa173a433796eeae2ca8c5f6129f2dc4de46d9",
Scopes: []string{},
Endpoint: oauth2.Endpoint{
AuthURL: "https://auth.gog.com/auth",
@ -153,15 +156,21 @@ func main() {
// for the scopes specified above.
url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline)
log.Println(color.CyanString("You will now be taken to your browser for authentication"))
time.Sleep(1 * time.Second)
//open.Run(url)
openBrowser(url)
time.Sleep(1 * time.Second)
log.Printf("Authentication URL: %s\n", url)
//http.HandleFunc("/oauth/callback", callbackHandler)
//log.Fatal(http.ListenAndServe(":9999", nil))
tok := loadToken("./.token")
if tok != nil {
client = conf.Client(ctx, tok)
_, err := client.Get("https://embed.gog.com/user/data/games")
if err != nil {
login(url)
} else {
log.Println(color.CyanString("Authentication successful"))
}
} else {
login(url)
}
gl := getGameList()
log.Println(gl.owned)
}