Я пытаюсь подключить приложение R Shiny к API Quickbooks Online для создания автоматических пользовательских отчетов. Приложение Shiny размещено на сервере R Studio Connect, который является автономным компьютером. API Quickbooks Online использует oauth2 для аутентификации, поэтому я знаю, что мне нужно сначала пройти аутентификацию с помощью браузера, а затем скопировать возвращенный код аутентификации, состояние и идентификатор области (также известный как идентификатор компании) на безголовый компьютер, прежде чем я смогу запросить получить и обновить sh токены.
Первая проблема, с которой я столкнулся, - это получение кода аутентификации, состояния и идентификатора области, но я решил это с помощью следующего приложения Shiny. URL-адрес приложения используется в качестве URI перенаправления и отображает значения для кода, состояния и идентификатора области.
library(stringr)
# Define UI for the application
ui <- fluidPage(
# Application title
titlePanel("Listening for Redirect"),
fluidPage(
h3("ClientData Values"),
verbatimTextOutput("clientdataText"),
br(),
h3("Query String Values"),
verbatimTextOutput("queryValues")
)
)
# Define the server logic
server <- function(input, output, session) {
# Store in a convenience variable
cdata <- session$clientData
# Values from cdata returned as text
output$clientdataText <- renderText({
cnames <- names(cdata)
allvalues <- lapply(cnames, function(name) {
paste(name, cdata[[name]], sep = " = ")
})
paste(allvalues, collapse = "\n")
})
query_string <- reactiveValues()
observeEvent(cdata, {
if (str_detect(cdata$url_search, "code|state|realmId")) {
query_string$code <- str_extract(cdata$url_search, "(?<=code\\=).*?(?=\\&state)")
query_string$state <- str_extract(cdata$url_search, "(?<=state\\=).*?(?=\\&realmId)")
query_string$realm <- str_extract(cdata$url_search, "(?<=realmId\\=).*$")
}
})
output$queryValues <- renderText({
cnames <- names(query_string)
allvalues <- lapply(cnames, function(name) {
paste(name, query_string[[name]], sep = " = ")
})
paste(allvalues, collapse = "\n")
})
}
# Run the application
shinyApp(ui = ui, server = server)
Получив код аутентификации, состояние и идентификатор области, я подумал, что могу получить токены доступа и refre sh с помощью оператора POST, но он вернул ошибку http 400. Я следовал рабочему примеру в песочнице API Quickbooks Online и вставил приведенный ниже формат кода.
library(httr)
POST(
url = "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer",
body = list(
"grant_type" = "authorization_code",
"code" = "<Authorization Code>",
"redirect_uri" = "<Shiny App URL>"
),
add_headers(
'Content-Type'= "application/x-www-form-urlencoded",
'Accept'= 'application/json',
'Authorization'= paste0('Basic ', <base64 encoded clientId : clientSecret as a string>)
)
)
Как я могу получить refre sh и токены доступа?