Forum Discussion
Custom Connector OAuth2 Scheduled Refresh Issue
I managed to make it work, it was a problem in one of my functions (I will check if I remember which one)
And I can confirm that Custom Connectors do refresh through the Gateway (no need to be the personal one).
EDIT: Found it. I implemented a logic developed by Matt Mason in the TokenMethod function. After this change, it worked.
TokenMethod = (grantType, code) =>
let
query = [
grant_type = grantType,
client_id = client_id,
client_secret = client_secret,
redirect_uri = redirect_uri
],
// Code from Matt Mason. Check https://www.mattmasson.com/
queryWithCode = if (grantType = "refresh_token") then [ refresh_token = code ] else [code = code],
response = Web.Contents(token_uri, [
Content = Text.ToBinary(Uri.BuildQueryString(query & queryWithCode)),
Headers=[#"Content-type" = "application/x-www-form-urlencoded",#"Accept" = "application/json"], ManualStatusHandling = {400}]),
body = Json.Document(response),
result = if (Record.HasFields(body, {"error", "error_description"}))
then error Error.Record(body[error], body[error_description], body)
else body
in
result;
Refresh = (resourceUrl, refresh_token) => TokenMethod("refresh_token", refresh_token);
Anonymous Thanks for the reponse, the issue I'm experiencing is actually after I get authenticated and attempt to refresh the data set.
However!!
You did help me identify a bug in my token refresh, so thank you very much. I was doing something very similar in regards to switching the parameter name depending on whether it was an access token request or token refresh. Turns out the documentation was lacking and I had the wrong name for the refresh token tokenField parameter.
Refresh = (resourceUrl, refresh_token) => TokenMethod(resourceUrl, "refresh_token", "refresh_token", refresh_token);
TokenMethod = (resourceUrl, grantType, tokenField, code) =>
let
queryString = [
grant_type = grantType,
redirect_uri = redirect_uri,
client_id = GetEnvironmentVariable(resourceUrl, "client_id"),
client_secret = GetEnvironmentVariable(resourceUrl, "client_secret")
],
queryWithCode = Record.AddField(queryString, tokenField, code),
base_url = GetAuthUrl(resourceUrl),
tokenResponse = Web.Contents(base_url & "connect/token", [
Content = Text.ToBinary(Uri.BuildQueryString(queryWithCode)),
Headers = [
#"Content-type" = "application/x-www-form-urlencoded",
#"Accept" = "application/json"
],
ManualStatusHandling = {400}
]),
body = Json.Document(tokenResponse),
result = if (Record.HasFields(body, {"error", "error_description"})) then
error Error.Record(body[error], body[error_description], body)
else if (Record.HasFields(body, {"error"})) then
error Error.Record(body[error], "Failed to login.", body)
else
body
in
result;
Cheers!
- Anonymous6 years agoNot applicable
Glad I could help somehow!
Cheers. - Anonymous5 years agoNot applicable
For anyone still having issues with scheduled refreshes of custom connectors using OAuth, I wrote a quick piece here that may be useful.