Files
ociclient/jwt.go

64 lines
1.3 KiB
Go

package repocli
import (
"bytes"
"context"
"fmt"
"net/http"
//"strconv"
//"strings"
"encoding/json"
"time"
)
type JWT struct {
Token string `json:"token"`
AccessToken string `json:"access_token"`
ExpiresIn int `json:"expires_in"`
IssuedAt time.Time `json:"issued_at"`
}
func (cli *Client) GetToken(ctx context.Context, uri string) (string, error) {
var err error
var token string
req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
if err != nil {
return token, err
}
req.Header.Set("User-Agent", cli.userAgent)
req.Header.Set("Accept", "*/*")
resp, err := cli.httpClient.Do(req)
if err != nil {
return token, err
}
defer resp.Body.Close()
if resp.StatusCode == http.StatusNotFound {
return token, err
}
if resp.StatusCode != http.StatusOK {
err := fmt.Errorf("Unxected response code %s", resp.Status)
return token, err
}
mime := resp.Header.Get("Content-Type")
if mime != "application/json" {
err := fmt.Errorf("Empty MIME type declaration")
return token, err
}
buffer := bytes.NewBuffer(nil)
recSize, err := Copy(ctx, buffer, resp.Body)
if recSize == 0 {
err := fmt.Errorf("Zero actual body size")
return token, err
}
tokenJson := buffer.Bytes()
jwt := &JWT{}
err = json.Unmarshal(tokenJson, jwt)
if err != nil {
return token, err
}
token = jwt.Token
return token, err
}