aboutsummaryrefslogtreecommitdiff
path: root/auth/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'auth/server.go')
-rw-r--r--auth/server.go60
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
}