oauth2/oauth2client/client.go

66 lines
1.5 KiB
Go

package oauth2client
import (
"errors"
"local/oauth2"
"net/http"
"net/url"
"strconv"
"strings"
"time"
)
func Authenticate(server string, w http.ResponseWriter, r *http.Request) error {
oauth2server, err := url.Parse(server)
if err != nil {
return err
}
access, err := r.Cookie(oauth2.COOKIE)
if err == http.ErrNoCookie {
return login(oauth2server, w, r)
}
return verify(access.Value, oauth2server, w, r)
}
func login(oauth2server *url.URL, w http.ResponseWriter, r *http.Request) error {
oauth2server.Path = "/users/log"
url := *r.URL
url.Host = r.Host
if url.Scheme == "" {
url.Scheme = "http"
}
cookie := &http.Cookie{
Name: oauth2.REDIRECT,
Value: url.String(),
SameSite: http.SameSiteLaxMode,
Path: "/authorize",
}
http.SetCookie(w, cookie)
http.Redirect(w, r, oauth2server.String(), http.StatusSeeOther)
return errors.New("logging in")
}
func verify(access string, oauth2server *url.URL, w http.ResponseWriter, r *http.Request) error {
oauth2server.Path = "/verify"
data := url.Values{}
data.Set("access", access)
req, err := http.NewRequest("POST", oauth2server.String(), strings.NewReader(data.Encode()))
if err != nil {
return err
}
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
req.Header.Add("Content-Length", strconv.Itoa(len(data.Encode())))
c := &http.Client{
Timeout: 5 * time.Second,
}
resp, err := c.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return login(oauth2server, w, r)
}
return nil
}