Как получить доступ и обновить sh токены в R из API Quickbooks Online - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь подключить приложение 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 и токены доступа?

...