diff options
Diffstat (limited to 'auth/server.go')
-rw-r--r-- | auth/server.go | 60 |
1 files changed, 41 insertions, 19 deletions
diff --git a/auth/server.go b/auth/server.go index 0f2496e..5bce2aa 100644 --- a/auth/server.go +++ b/auth/server.go @@ -19,51 +19,73 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. package auth import ( + "context" "net/http" "net/url" + "html" "encoding/json" "os" "fmt" + "errors" ) func listen(clientId, verifier string) { - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - code, codeExists := r.URL.Query()["code"] + mux := http.NewServeMux() + server := &http.Server{Addr: ":8000", Handler: mux} + + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + code, codeExists := r.URL.Query()["code"] if codeExists { - accessToken, refreshToken, expiresIn := requestToken(clientId, verifier, code[0]) - setToken(accessToken) - setRefreshToken(refreshToken) - setExpiresIn(expiresIn) - fmt.Println("\x1b[32mYou have successfully logged into macli.\x1b[0m") - fmt.Println("\x1b[32mYou can close the web browser tab now.\x1b[0m") - os.Exit(0) + err := getToken(clientId, verifier, code[0]) + if err != nil { + fmt.Fprintf(w, "<p>An error occoured while logging in: %s</p>", html.EscapeString(err.Error())) + + fmt.Println("Error while requesting an access token from MyAnimeList:", err) + } else { + fmt.Fprintf(w, "<p>Login successful! You may close this tab now.</p>") + + fmt.Println("\x1b[32mYou have successfully logged into macli.\x1b[0m") + fmt.Println("\x1b[32mYou can close the web browser tab now.\x1b[0m") + } + } else { + fmt.Fprintf(w, "<p>An error occoured while logging in (invalid request)</p>") + + fmt.Println("An error occoured while logging in (invalid request)") } + + go server.Shutdown(context.Background()) }) - err := http.ListenAndServe(":8000", nil) - if err != nil { + err := server.ListenAndServe() + if err != nil && err != http.ErrServerClosed { fmt.Println("There was an error initialising the server", err.Error()) os.Exit(1) } } -func requestToken(clientId, verifier, code string) (string, string, string) { +func getToken(clientId, verifier, code string) error { data := url.Values{ - "client_id": {clientId}, - "code_verifier": {verifier}, - "grant_type": {"authorization_code"}, - "code": {code}, + "client_id": {clientId}, + "code_verifier": {verifier}, + "grant_type": {"authorization_code"}, + "code": {code}, } resp, err := http.PostForm("https://myanimelist.net/v1/oauth2/token", data) if err != nil { - fmt.Println("Error while requesting an access token:", err) - os.Exit(1) + return err } var res map[string]interface{} json.NewDecoder(resp.Body).Decode(&res) - return fmt.Sprintf("%v", res["access_token"]), fmt.Sprintf("%v", res["refresh_token"]), fmt.Sprintf("%v", res["expires_in"]) + if res["error"] != nil { + return errors.New(fmt.Sprintf("%v (%v)", res["message"], res["error"])) + } + + setToken(fmt.Sprintf("%v", res["access_token"])) + //setRefreshToken(refreshToken) + //setExpiresIn(expiresIn) + return nil } |