From 2d8afa29e4f4056abf9c143e44e4893df30eb557 Mon Sep 17 00:00:00 2001 From: Guilherme Thomazi Date: Tue, 27 Sep 2016 19:24:26 -0300 Subject: [PATCH 1/5] fix(connection): adding refreshToken to oauth object --- force/force.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/force/force.go b/force/force.go index 2ce0cec..231960d 100644 --- a/force/force.go +++ b/force/force.go @@ -89,11 +89,12 @@ func CreateWithAccessToken(version, clientId, accessToken, instanceUrl string) ( return forceApi, nil } -func CreateWithRefreshToken(version, clientId, accessToken, instanceUrl string) (*ForceApi, error) { +func CreateWithRefreshToken(version, clientId, refreshToken, instanceUrl string) (*ForceApi, error) { oauth := &forceOauth{ clientId: clientId, AccessToken: accessToken, InstanceUrl: instanceUrl, + RefreshToken: refreshToken, } forceApi := &ForceApi{ From c1475fce5ed2b8a4810bc919ad3410d9fa73032c Mon Sep 17 00:00:00 2001 From: Guilherme Thomazi Date: Tue, 27 Sep 2016 19:27:52 -0300 Subject: [PATCH 2/5] fix(connection): adding refreshToken to oauth object --- force/force.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/force/force.go b/force/force.go index 231960d..75daff1 100644 --- a/force/force.go +++ b/force/force.go @@ -92,9 +92,8 @@ func CreateWithAccessToken(version, clientId, accessToken, instanceUrl string) ( func CreateWithRefreshToken(version, clientId, refreshToken, instanceUrl string) (*ForceApi, error) { oauth := &forceOauth{ clientId: clientId, - AccessToken: accessToken, InstanceUrl: instanceUrl, - RefreshToken: refreshToken, + refreshToken: refreshToken, } forceApi := &ForceApi{ From b73ecc8521e1d2b4d630ef4f62cc946c1790bd71 Mon Sep 17 00:00:00 2001 From: Guilherme Thomazi Date: Tue, 27 Sep 2016 19:32:35 -0300 Subject: [PATCH 3/5] fix(connection): adding refreshToken to oauth object --- force/force.go | 1 + 1 file changed, 1 insertion(+) diff --git a/force/force.go b/force/force.go index 75daff1..12d2f27 100644 --- a/force/force.go +++ b/force/force.go @@ -94,6 +94,7 @@ func CreateWithRefreshToken(version, clientId, refreshToken, instanceUrl string) clientId: clientId, InstanceUrl: instanceUrl, refreshToken: refreshToken, + AccessToken: nil, } forceApi := &ForceApi{ From 298ce6de1b9aed6007351b3b4c4e4044529ea14a Mon Sep 17 00:00:00 2001 From: Guilherme Thomazi Date: Tue, 27 Sep 2016 19:37:22 -0300 Subject: [PATCH 4/5] fix(connection): adding refreshToken to oauth object --- force/force.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/force/force.go b/force/force.go index 12d2f27..07905af 100644 --- a/force/force.go +++ b/force/force.go @@ -89,12 +89,12 @@ func CreateWithAccessToken(version, clientId, accessToken, instanceUrl string) ( return forceApi, nil } -func CreateWithRefreshToken(version, clientId, refreshToken, instanceUrl string) (*ForceApi, error) { +func CreateWithRefreshToken(version, clientId, clientSecret, refreshToken, instanceUrl string) (*ForceApi, error) { oauth := &forceOauth{ clientId: clientId, + clientSecret: clientSecret, InstanceUrl: instanceUrl, refreshToken: refreshToken, - AccessToken: nil, } forceApi := &ForceApi{ @@ -174,3 +174,4 @@ func (forceApi *ForceApi) trace(name string, value interface{}, format string) { forceApi.logger.Printf(logMsg, forceApi.logPrefix, name, value) } } + From aca7b9eb0c337298d116af86c399fe87d0328651 Mon Sep 17 00:00:00 2001 From: Guilherme Thomazi Date: Wed, 28 Sep 2016 14:22:28 -0300 Subject: [PATCH 5/5] adding separated request function to get access token --- force/client.go | 59 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/force/client.go b/force/client.go index cfd65ba..822adb1 100644 --- a/force/client.go +++ b/force/client.go @@ -7,15 +7,17 @@ import ( "io/ioutil" "net/http" "net/url" - + "strings" + "encoding/json" "github.com/nimajalali/go-force/forcejson" ) const ( - version = "1.0.0" - userAgent = "go-force/" + version - contentType = "application/json" - responseType = "application/json" + version = "1.0.0" + userAgent = "go-force/" + version + refreshContentType = "application/x-www-form-urlencoded" + contentType = "application/json" + responseType = "application/json" ) // Get issues a GET to the specified path with the given params and put the @@ -27,6 +29,12 @@ func (forceApi *ForceApi) Get(path string, params url.Values, out interface{}) e // Post issues a POST to the specified path with the given params and payload // and put the unmarshalled (json) result in the third parameter func (forceApi *ForceApi) Post(path string, params url.Values, payload, out interface{}) error { + _, refresh_token := payload.(map[string]string)["refresh_token"] + + if refresh_token { + return forceApi.request_access_token(path, params, payload, out) + } + return forceApi.request("POST", path, params, payload, out) } @@ -47,11 +55,48 @@ func (forceApi *ForceApi) Delete(path string, params url.Values) error { return forceApi.request("DELETE", path, params, nil, nil) } +func (forceApi *ForceApi) request_access_token(path string, params url.Values, payload, out interface{}) error { + mPayload, _ := payload.(map[string]string) + + var uri bytes.Buffer + uri.WriteString(forceApi.oauth.InstanceUrl) + uri.WriteString(path) + if params != nil && len(params) != 0 { + uri.WriteString("?") + uri.WriteString(params.Encode()) + } + + url_param := `grant_type=refresh_token&` + url_param += `client_id=%s&` + url_param += `client_secret=%s&` + url_param += `refresh_token=%s` + url_param = fmt.Sprintf( + url_param, + mPayload["client_id"], + mPayload["client_secret"], + mPayload["refresh_token"], + ) + + req, _ := http.NewRequest("POST", uri.String(), strings.NewReader(url_param)) + + req.Header.Add("Content-Type", refreshContentType) + req.Header.Add("Cache-Control", "no-cache") + + res, _ := http.DefaultClient.Do(req) + defer res.Body.Close() + + json.NewDecoder(res.Body).Decode(out) + + return nil +} + func (forceApi *ForceApi) request(method, path string, params url.Values, payload, out interface{}) error { + if err := forceApi.oauth.Validate(); err != nil { return fmt.Errorf("Error creating %v request: %v", method, err) } + // Build Uri var uri bytes.Buffer uri.WriteString(forceApi.oauth.InstanceUrl) @@ -64,7 +109,6 @@ func (forceApi *ForceApi) request(method, path string, params url.Values, payloa // Build body var body io.Reader if payload != nil { - jsonBytes, err := forcejson.Marshal(payload) if err != nil { return fmt.Errorf("Error marshaling encoded payload: %v", err) @@ -81,8 +125,8 @@ func (forceApi *ForceApi) request(method, path string, params url.Values, payloa // Add Headers req.Header.Set("User-Agent", userAgent) - req.Header.Set("Content-Type", contentType) req.Header.Set("Accept", responseType) + req.Header.Set("Content-Type", contentType) req.Header.Set("Authorization", fmt.Sprintf("%v %v", "Bearer", forceApi.oauth.AccessToken)) // Send @@ -159,3 +203,4 @@ func (forceApi *ForceApi) traceResponseBody(body []byte) { forceApi.trace("Response Body:", string(body), "%s") } } +