1
0
mirror of https://github.com/raseels-repos/golang-saas-starter-kit.git synced 2025-06-06 23:46:29 +02:00
2019-07-13 11:42:37 -08:00

74 lines
1.7 KiB
Go

package auth
import (
"github.com/dgrijalva/jwt-go"
"github.com/pborman/uuid"
"github.com/pkg/errors"
"time"
)
// Storage provides the ability to persist keys to custom locations.
type Storage interface {
// Keys returns a map of private keys by kID.
Keys() map[string]*PrivateKey
// Current returns the most recently generated private key.
Current() *PrivateKey
}
// StorageMemory is a storage engine that stores a single private key in memory.
type StorageMemory struct {
privateKey *PrivateKey
}
// Keys returns a map of private keys by kID.
func (s *StorageMemory) Keys() map[string]*PrivateKey {
if s == nil || s.privateKey == nil {
return map[string]*PrivateKey{}
}
return map[string]*PrivateKey{
s.privateKey.keyID: s.privateKey,
}
}
// Current returns the most recently generated private key.
func (s *StorageMemory) Current() *PrivateKey {
if s == nil {
return nil
}
return s.privateKey
}
// NewAuthenticatorMemory is a help function that inits a new Authenticator with a single key stored in memory.
func NewAuthenticatorMemory(now time.Time) (*Authenticator, error) {
storage, err := NewStorageMemory()
if err != nil {
return nil, err
}
return NewAuthenticator(storage, now)
}
// NewStorageMemory implements the interface Storage to store a single key in memory.
func NewStorageMemory() (*StorageMemory, error) {
privateKey, err := KeyGen()
if err != nil {
return nil, errors.Wrap(err, "failed to generate new private key")
}
pk, err := jwt.ParseRSAPrivateKeyFromPEM(privateKey)
if err != nil {
return nil, errors.Wrap(err, "parsing auth private key")
}
storage := &StorageMemory{
privateKey: &PrivateKey{
PrivateKey: pk,
keyID: uuid.NewRandom().String(),
algorithm: algorithm,
},
}
return storage, nil
}