57 lines
1.6 KiB
Go
57 lines
1.6 KiB
Go
|
package oauth
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"io"
|
||
|
"io/ioutil"
|
||
|
"log"
|
||
|
"net/http"
|
||
|
"os"
|
||
|
"time"
|
||
|
"x/oauth2"
|
||
|
"github.com/ProjectSegfault/segfautils/config"
|
||
|
"github.com/goccy/go-json"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
clientID = config.OAuthClientID()
|
||
|
clientSecret = config.OAuthClientSecret()
|
||
|
redirectURL = config.RedirectURL()
|
||
|
authURL = config.AuthURL()
|
||
|
)
|
||
|
|
||
|
func LoginOAuth() {
|
||
|
// Create a new redirect route route
|
||
|
http.HandleFunc("/oauth/redirect", func(w http.ResponseWriter, r *http.Request) {
|
||
|
err := r.ParseForm()
|
||
|
if err != nil {
|
||
|
fmt.Fprintf(os.Stdout, "could not parse query: %v", err)
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
}
|
||
|
code := r.FormValue("code")
|
||
|
reqURL := fmt.Sprintf("%s/login/oauth/access_token?client_id=%s&client_secret=%s&code=%s", authURL, clientID, clientSecret, code)
|
||
|
req, err := http.NewRequest(http.MethodPost, reqURL, nil)
|
||
|
if err != nil {
|
||
|
fmt.Fprintf(os.Stdout, "could not create HTTP request: %v", err)
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
}
|
||
|
req.Header.Set("accept", "application/json")
|
||
|
res, err := httpClient.Do(req)
|
||
|
if err != nil {
|
||
|
fmt.Fprintf(os.Stdout, "could not send HTTP request: %v", err)
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
}
|
||
|
defer res.Body.Close()
|
||
|
var t OAuthAccessResponse
|
||
|
if err := json.NewDecoder(res.Body).Decode(&t); err != nil {
|
||
|
fmt.Fprintf(os.Stdout, "could not parse JSON response: %v", err)
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
}
|
||
|
w.Header().Set("Location", "/announcements/?access_token="+t.AccessToken)
|
||
|
w.WriteHeader(http.StatusFound)
|
||
|
}
|
||
|
|
||
|
type OAuthAccessResponse struct {
|
||
|
AccessToken string `json:"access_token"`
|
||
|
}
|