package main import ( "encoding/json" "errors" "net/http" "github.com/julienschmidt/httprouter" ) var AuthFunc = checkAuth func init() { router.GET("/api/auth", apiAuthHandler(validateAuthToken)) router.POST("/api/auth", apiHandler(func(ps httprouter.Params, body []byte) (interface{}, error) { return AuthFunc(ps, body) })) } func validateAuthToken(s Student, _ httprouter.Params, _ []byte) (interface{}, error) { return s, nil } type loginForm struct { Username string Password string } func dummyAuth(_ httprouter.Params, body []byte) (interface{}, error) { var lf loginForm if err := json.Unmarshal(body, &lf); err != nil { return nil, err } var std Student var err error if !studentExists(lf.Username) { if std, err = NewStudent(lf.Username); err != nil { return nil, err } } else if std, err = getStudentByLogin(lf.Username); err != nil { return nil, err } session, err := std.NewSession() if err != nil { return nil, err } res := map[string]interface{}{} res["status"] = "OK" res["id_session"] = session.Id return res, nil } func checkAuth(_ httprouter.Params, body []byte) (interface{}, error) { var lf loginForm if err := json.Unmarshal(body, &lf); err != nil { return nil, err } if r, err := http.NewRequest("GET", "https://fic.srs.epita.fr/2020/", nil); err != nil { return nil, err } else { r.SetBasicAuth(lf.Username, lf.Password) if resp, err := http.DefaultClient.Do(r); err != nil { return nil, err } else { defer resp.Body.Close() if resp.StatusCode == http.StatusOK { return dummyAuth(nil, body) } else { return nil, errors.New(`{"status": "Invalid username or password"}`) } } } }