lib/app/auth0.go

68 lines
1.4 KiB
Go

package app
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strings"
"time"
)
type auth0TokenResponse struct {
AccessToken string
TokenType string
}
const tokenURL = "https://taxnexus.auth0.com/oauth/token" //nolint:gosec // false positive
const tokenTimeout = 86400 * time.Second
const requestTemplate = `
{
"client_id": "%s",
"client_secret": "%s"
"audience": "%s",
"grant_type": "client_credentials"
}
`
var accessToken string
var authTokenTime time.Time
// GetAuth0AccessToken uses conf file values to get an Auth0 access token
func GetAuth0AccessToken() string {
if time.Now().Before(authTokenTime) && accessToken != "" {
return accessToken
}
serviceAccount := GetServiceAccount("auth0")
payload := strings.NewReader(
fmt.Sprintf(requestTemplate,
serviceAccount.ClientID,
serviceAccount.ClientSecret,
serviceAccount.Endpoint.Scheme+"://"+
serviceAccount.Endpoint.Host+
serviceAccount.Endpoint.BasePath) + "/")
req, err := http.NewRequest("POST", tokenURL, payload)
if err != nil {
return ""
}
req.Header.Add("content-type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
return ""
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return ""
}
var response *auth0TokenResponse
err = json.Unmarshal(body, response)
if err != nil {
return ""
}
accessToken = response.AccessToken
authTokenTime = time.Now().Add(tokenTimeout)
return accessToken
}