81 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package auth
 | |
| 
 | |
| import (
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/google/uuid"
 | |
| 	"github.com/micro/go-micro/v3/auth"
 | |
| 	"github.com/micro/go-micro/v3/logger"
 | |
| )
 | |
| 
 | |
| // Verify the auth credentials and refresh the auth token periodically
 | |
| func Verify(a auth.Auth) error {
 | |
| 	// extract the account creds from options, these can be set by flags
 | |
| 	accID := a.Options().ID
 | |
| 	accSecret := a.Options().Secret
 | |
| 
 | |
| 	// if no credentials were provided, self generate an account
 | |
| 	if len(accID) == 0 && len(accSecret) == 0 {
 | |
| 		opts := []auth.GenerateOption{
 | |
| 			auth.WithType("service"),
 | |
| 			auth.WithScopes("service"),
 | |
| 		}
 | |
| 
 | |
| 		acc, err := a.Generate(uuid.New().String(), opts...)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		if logger.V(logger.DebugLevel, logger.DefaultLogger) {
 | |
| 			logger.Debugf("Auth [%v] Generated an auth account", a.String())
 | |
| 		}
 | |
| 
 | |
| 		accID = acc.ID
 | |
| 		accSecret = acc.Secret
 | |
| 	}
 | |
| 
 | |
| 	// generate the first token
 | |
| 	token, err := a.Token(
 | |
| 		auth.WithCredentials(accID, accSecret),
 | |
| 		auth.WithExpiry(time.Minute*10),
 | |
| 	)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	// set the credentials and token in auth options
 | |
| 	a.Init(
 | |
| 		auth.ClientToken(token),
 | |
| 		auth.Credentials(accID, accSecret),
 | |
| 	)
 | |
| 
 | |
| 	// periodically check to see if the token needs refreshing
 | |
| 	go func() {
 | |
| 		timer := time.NewTicker(time.Second * 15)
 | |
| 
 | |
| 		for {
 | |
| 			<-timer.C
 | |
| 
 | |
| 			// don't refresh the token if it's not close to expiring
 | |
| 			tok := a.Options().Token
 | |
| 			if tok.Expiry.Unix() > time.Now().Add(time.Minute).Unix() {
 | |
| 				continue
 | |
| 			}
 | |
| 
 | |
| 			// generate the first token
 | |
| 			tok, err := a.Token(
 | |
| 				auth.WithToken(tok.RefreshToken),
 | |
| 				auth.WithExpiry(time.Minute*10),
 | |
| 			)
 | |
| 			if err != nil {
 | |
| 				logger.Warnf("[Auth] Error refreshing token: %v", err)
 | |
| 				continue
 | |
| 			}
 | |
| 
 | |
| 			// set the token
 | |
| 			a.Init(auth.ClientToken(tok))
 | |
| 		}
 | |
| 	}()
 | |
| 
 | |
| 	return nil
 | |
| }
 |