Files
cloud-services/pkg/superset/login.go

88 lines
1.7 KiB
Go

package superset
import (
"encoding/json"
"io/ioutil"
"net/http"
"fiskerinc.com/modules/httpclient"
"fiskerinc.com/modules/redis"
"github.com/pkg/errors"
)
var loginFunc = login
type supersetRequest struct {
Username string `json:"username"`
Password string `json:"password"`
Provider string `json:"provider"`
Refresh bool `json:"refresh"`
}
type supersetResponse struct {
AccessToken string `json:"access_token"`
RefreshToken string `json:"refresh_token"`
}
func GetAccessToken(r redis.Client) (string, error) {
token, err := getCachedAccToken(r)
if err != nil && !errors.Is(err, errTokenNotFound) {
return "", err
}
if err == nil {
return token, nil
}
token, err = login(r)
if err != nil {
return "", err
}
return token, nil
}
func login(r redis.Client) (string, error) {
headers := http.Header{}
headers.Add("Content-Type", "application/json")
resp, err := httpclient.Post(
host+"/security/login",
supersetRequest{
Username: accUserName,
Password: password,
Provider: "db",
Refresh: true,
},
headers,
)
if err != nil {
return "", err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return "", errors.Errorf("superset login answered with status: %s", resp.Status)
}
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", errors.WithStack(err)
}
sresp := supersetResponse{}
err = json.Unmarshal(b, &sresp)
if err != nil {
return "", errors.WithStack(err)
}
err = r.Set(redis.SupersetAccTokenKey, sresp.AccessToken)
if err != nil {
return "", err
}
return sresp.AccessToken, nil
}
// SetLoginFunc must be useful for testing.
func SetLoginFunc(login func(r redis.Client) (string, error)) {
loginFunc = login
}