github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/actor/v7action/token.go (about)

     1  package v7action
     2  
     3  import (
     4  	"strings"
     5  	"time"
     6  
     7  	"github.com/SermoDigital/jose/jws"
     8  )
     9  
    10  func (actor Actor) RefreshAccessToken() (string, error) {
    11  	var expiresIn time.Duration
    12  
    13  	refreshToken := actor.Config.RefreshToken()
    14  
    15  	accessTokenString := strings.TrimPrefix(actor.Config.AccessToken(), "bearer ")
    16  	token, err := jws.ParseJWT([]byte(accessTokenString))
    17  
    18  	if err == nil {
    19  		expiration, ok := token.Claims().Expiration()
    20  		if ok {
    21  			expiresIn = time.Until(expiration)
    22  		}
    23  	}
    24  
    25  	if err != nil || expiresIn < time.Minute {
    26  		tokens, err := actor.UAAClient.RefreshAccessToken(refreshToken)
    27  		if err != nil {
    28  			return "", err
    29  		}
    30  
    31  		actor.Config.SetAccessToken(tokens.AuthorizationToken())
    32  		actor.Config.SetRefreshToken(tokens.RefreshToken)
    33  
    34  		return tokens.AuthorizationToken(), nil
    35  	}
    36  	return actor.Config.AccessToken(), nil
    37  }