86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
package kekskurseauth
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
)
|
|
|
|
type Auth struct {
|
|
config AuthConfig
|
|
clientID string
|
|
clientSecret string
|
|
}
|
|
|
|
func NewAuthWithConfig(config AuthConfig, clientID, clientSecret string) (Auth, error) {
|
|
a := Auth{}
|
|
a.config = config
|
|
a.clientID = clientID
|
|
a.clientSecret = clientSecret
|
|
return a, nil
|
|
}
|
|
|
|
func NewAuthWithConfigurationURL(url, clientID, clientSecret string) (Auth, error) {
|
|
a := Auth{}
|
|
a.clientID = clientID
|
|
a.clientSecret = clientSecret
|
|
config := AuthConfig{}
|
|
|
|
res, err := http.Get(url)
|
|
if err != nil {
|
|
return Auth{}, fmt.Errorf("%w: %q", ErrCantGetConfiguratorData, err)
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
bodyContent, err := io.ReadAll(res.Body)
|
|
if err != nil {
|
|
return Auth{}, fmt.Errorf("%w: %q", ErrCantGetConfiguratorData, err)
|
|
}
|
|
|
|
err = json.Unmarshal(bodyContent, &config)
|
|
if err != nil {
|
|
return Auth{}, fmt.Errorf("%w: %q", ErrCantGetConfiguratorData, err)
|
|
}
|
|
|
|
a.config = config
|
|
return a, nil
|
|
}
|
|
|
|
func (a Auth) GetAuthorizationURL(redirectUrl string, scope []string, state string) (string, error) {
|
|
if a.config.AuthorizationEndpoint == "" {
|
|
return "", fmt.Errorf("%w: %s", ErrCantGetAuthorizationURL, "AuthorizationEndpoint in config is empty")
|
|
}
|
|
|
|
if a.clientID == "" {
|
|
return "", fmt.Errorf("%w: %s", ErrCantGetAuthorizationURL, "clientid in config is empty")
|
|
}
|
|
|
|
url, err := url.Parse(a.config.AuthorizationEndpoint)
|
|
if err != nil {
|
|
return "", fmt.Errorf("%w: %q", ErrCantGetAuthorizationURL, err)
|
|
}
|
|
|
|
values := url.Query()
|
|
|
|
values.Set("client_id", a.clientID)
|
|
if redirectUrl != "" {
|
|
values.Set("redirect_uri", redirectUrl)
|
|
}
|
|
|
|
if len(scope) > 0 {
|
|
values.Set("scope", strings.Join(scope, "+"))
|
|
}
|
|
|
|
if state != "" {
|
|
values.Set("state", state)
|
|
}
|
|
|
|
values.Set("response_type", "code")
|
|
|
|
url.RawQuery = values.Encode()
|
|
|
|
return url.String(), nil
|
|
}
|