github.com/grokify/go-ringcentral-client@v0.3.31/engagevoice/v1/util/lite/ringcentral_credentials.go (about) 1 package lite 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 "net/url" 8 9 "github.com/grokify/goauth" 10 "github.com/grokify/goauth/authutil" 11 "github.com/grokify/mogo/encoding/jsonutil" 12 "github.com/grokify/mogo/errors/errorsutil" 13 ) 14 15 type EngageCredentials struct { 16 Credentials goauth.Credentials 17 EngageToken EngageToken 18 } 19 20 func NewEngageCredentialsJSON(rcCredentialsJSON []byte) (EngageCredentials, error) { 21 ec := EngageCredentials{} 22 rcCredentials, err := goauth.NewCredentialsJSON(rcCredentialsJSON, nil) 23 if err != nil { 24 return ec, errorsutil.Wrap(err, "NewEngageCredentialsJSON>>ringcentral.NewCredentialsJSON") 25 } 26 ec.Credentials = rcCredentials 27 return ec, nil 28 } 29 30 func (ec *EngageCredentials) LoadNewTokens(ctx context.Context) error { 31 rcToken, err := ec.Credentials.NewToken(ctx) 32 if err != nil { 33 return errorsutil.Wrap(err, "EngageCredentials>>ec.Credentials.NewToken()") 34 } 35 evToken, err := RcToEvToken(rcToken.AccessToken) 36 if err != nil { 37 return err 38 } 39 ec.EngageToken = evToken 40 return nil 41 } 42 43 func (ec *EngageCredentials) NewClient(ctx context.Context) (*http.Client, error) { 44 err := ec.LoadNewTokens(ctx) 45 if err != nil { 46 return nil, err 47 } 48 engageClient := authutil.NewClientToken( 49 authutil.TokenBearer, ec.EngageToken.AccessToken, false) 50 return engageClient, nil 51 } 52 53 type EngageToken struct { 54 AccessToken string `json:"accessToken"` 55 TokenType string `json:"tokenType"` 56 } 57 58 func RcToEvToken(rctoken string) (EngageToken, error) { 59 evToken := EngageToken{} 60 61 res, err := http.PostForm( 62 "https://engage.ringcentral.com/api/auth/login/rc/accesstoken", 63 url.Values{"rcAccessToken": {rctoken}, "rcTokenType": {"Bearer"}}) 64 if err != nil { 65 return evToken, errorsutil.Wrap(err, "RcToEvToken.PostForm") 66 } 67 if res.StatusCode >= 300 { 68 return evToken, fmt.Errorf("RcToEvToken.ApiResponse.StatusCode [%v]", res.StatusCode) 69 } 70 71 _, err = jsonutil.UnmarshalReader(res.Body, &evToken) 72 if err != nil { 73 err = errorsutil.Wrap(err, "RcToEvToken.jsonutil.UnmarshalIoReader") 74 } 75 return evToken, err 76 }