Files
ipsw/pkg/appstore/auth.go

57 lines
1.2 KiB
Go

package appstore
import (
"fmt"
"os"
"time"
"github.com/golang-jwt/jwt/v5"
)
const defaultJWTLife = time.Minute
func (as *AppStore) createToken(life time.Duration) error {
if as.token != "" {
return nil
}
token := jwt.NewWithClaims(jwt.SigningMethodES256, jwt.RegisteredClaims{
Issuer: as.Iss,
IssuedAt: jwt.NewNumericDate(time.Now()),
ExpiresAt: jwt.NewNumericDate(time.Now().Add(life)), // Max 20 mins
Audience: jwt.ClaimStrings{"appstoreconnect-v1"},
})
token.Header["kid"] = as.Kid // Key ID
keyData, err := os.ReadFile(as.P8)
if err != nil {
return fmt.Errorf("createToken: failed to read p8 key: %v", err)
}
privateKey, err := jwt.ParseECPrivateKeyFromPEM(keyData)
if err != nil {
return fmt.Errorf("parsing private key: %w", err)
}
as.token, err = token.SignedString(privateKey)
if err != nil {
return fmt.Errorf("signing token: %w", err)
}
return nil
}
// GetToken returns the current JWT token
func (as *AppStore) GetToken() string {
return as.token
}
// GenerateToken generates a new JWT token
func (as *AppStore) GenerateToken(life time.Duration) (string, error) {
if err := as.createToken(life); err != nil {
return "", err
}
return as.token, nil
}