mirror of
https://github.com/mentos1386/zdravko.git
synced 2024-11-22 15:53:45 +00:00
63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package handlers
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"net/http"
|
|
|
|
"code.tjo.space/mentos1386/zdravko/internal"
|
|
"golang.org/x/oauth2"
|
|
)
|
|
|
|
func newOAuth2(config *internal.Config) *oauth2.Config {
|
|
return &oauth2.Config{
|
|
ClientID: config.OAUTH2_CLIENT_ID,
|
|
ClientSecret: config.OAUTH2_CLIENT_SECRET,
|
|
Scopes: config.OAUTH2_SCOPES,
|
|
RedirectURL: config.ROOT_URL + "/oauth2/callback",
|
|
Endpoint: oauth2.Endpoint{
|
|
TokenURL: config.OAUTH2_ENDPOINT_TOKEN_URL,
|
|
AuthURL: config.OAUTH2_ENDPOINT_AUTH_URL,
|
|
},
|
|
}
|
|
}
|
|
|
|
func (h *BaseHandler) OAuth2LoginGET(w http.ResponseWriter, r *http.Request) {
|
|
conf := newOAuth2(h.config)
|
|
|
|
url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline)
|
|
|
|
http.Redirect(w, r, url, http.StatusTemporaryRedirect)
|
|
}
|
|
|
|
func (h *BaseHandler) OAuth2CallbackGET(w http.ResponseWriter, r *http.Request) {
|
|
ctx := context.Background()
|
|
conf := newOAuth2(h.config)
|
|
|
|
// Exchange the code for a new token.
|
|
tok, err := conf.Exchange(r.Context(), r.URL.Query().Get("code"))
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
// Ge the user information.
|
|
client := oauth2.NewClient(ctx, oauth2.StaticTokenSource(tok))
|
|
resp, err := client.Get(h.config.OAUTH2_ENDPOINT_USER_INFO_URL)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
defer resp.Body.Close()
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
}
|
|
|
|
_, err = w.Write(body)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
}
|