diff --git a/auth.go b/auth.go index 78ed771..50ad917 100644 --- a/auth.go +++ b/auth.go @@ -1,50 +1,72 @@ package writeas import ( "fmt" "net/http" ) // LogIn authenticates a user with Write.as. // See https://developer.write.as/docs/api/#authenticate-a-user func (c *Client) LogIn(username, pass string) (*AuthUser, error) { u := &AuthUser{} up := struct { Alias string `json:"alias"` Pass string `json:"pass"` }{ Alias: username, Pass: pass, } env, err := c.post("/auth/login", up, u) if err != nil { return nil, err } var ok bool if u, ok = env.Data.(*AuthUser); !ok { return nil, fmt.Errorf("Wrong data returned from API.") } status := env.Code if status == http.StatusOK { return u, nil } else if status == http.StatusBadRequest { return nil, fmt.Errorf("Bad request: %s", env.ErrorMessage) } else if status == http.StatusUnauthorized { return nil, fmt.Errorf("Incorrect password.") } else if status == http.StatusNotFound { return nil, fmt.Errorf("User does not exist.") } else if status == http.StatusTooManyRequests { return nil, fmt.Errorf("Stop repeatedly trying to log in.") } return nil, fmt.Errorf("Problem authenticating: %d. %v\n", status, err) } +// LogOut logs the current user out, making the Client's current access token +// invalid. +func (c *Client) LogOut() error { + env, err := c.delete("/auth/me", nil) + if err != nil { + return err + } + + status := env.Code + if status != http.StatusNoContent { + if status == http.StatusNotFound { + return fmt.Errorf("Access token is invalid or doesn't exist") + } + return fmt.Errorf("Unable to log out: %v", env.ErrorMessage) + } + + // Logout successful, so update the Client + c.token = "" + + return nil +} + func (c *Client) isNotLoggedIn(code int) bool { if c.token == "" { return false } return code == http.StatusUnauthorized }