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:
parent
f502f51e59
commit
e3e6c2d0c4
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
.token
|
||||
129
main.go
129
main.go
@ -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)
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user