Не удается сохранить сеанс входа в систему googleAuthR - PullRequest
0 голосов
/ 14 июня 2019

Я создал общий поток входа в систему для приложения Shiny с помощью модуля googleAuthR.Процесс входа в систему работает, как и ожидалось, но у меня возникают проблемы с сохранением сеанса при перезагрузке страницы.

Эти параметры инициализации модуля googleAuthR, вероятно, связаны с проблемой (чтение различной документации): Appro_prompt = "auto", access_type= "offline", revoke = TRUE

Вот рабочая логика входа в систему:

// -----> server

library(shiny)

server <- function(input, output, session) {

  loggedIn <- callModule(authorize, 'login')

  observe({
    req(loggedIn())
    callModule(moduleForLoggedInUsersOnly, 'dashboard')
  }) 

}

ui <- bootstrapPage(
  authorizeUI('login'),
  uiOutput('dashboard')
) 

shinyApp(ui, server)



// -----> authorize

library(googleAuthR)

options(googleAuthR.scopes.selected = 'email')
options(googleAuthR.webapp.client_id = Sys.getenv('GOOGLE_AUTH_CLIENT_ID'))
options(googleAuthR.webapp.client_secret = Sys.getenv('GOOGLE_AUTH_CLIENT_SECRET'))

authorizeUI <- function(id) {
  ns <- NS(id)

  fluidPage(id = 'login',
    googleAuthUI(ns('loginButton'))
  )
}

authorize <- function(input, output, session) {
  if (GLOBAL_SKIP_LOGIN) return(function()TRUE)

  access_token <- callModule(googleAuth, "loginButton", login_text = "Login with Google", approval_prompt = "auto", access_type = "offline", revoke = TRUE)

  token <- reactiveVal(value = NULL)

  loggedIn <- reactive({
    req(access_token())
    token(isolate(access_token()$credentials$access_token))
    with_shiny(f = authReturnCode, shiny_access_token = access_token())
  })

  authReturnCode <- function() {
    securityCode <- getOption("googleAuthR.securitycode")
    pars <- shiny::parseQueryString(session$clientData$url_search)
    return(ifelse(pars$state == securityCode & !is.null(token()), TRUE, FALSE))
  }

  return(loggedIn)

}

Проблема с перезагрузкой страницы:

Warning: Error in : Authentication error: invalid_grantBad Request
  127: stop
  126: gar_shiny_getToken
  125: <reactive>
  109: accessToken
   96: shiny::renderUI

Идеи / советы по исправлениюthis?


Решено:

Библиотека googleAuthR поставляется с модулем под названием googleSignIn, который обрабатывает простой поток входа в систему лучше, чем его предок.

Если кому-то нужно разместить контент за стеной входа, вот простая настройка:

server <- function(input, output, session) {

  loggedIn <- callModule(googleSignIn, 'login')

  observe({
    req(loggedIn())
    callModule(onlyForLoggedInUsers, 'dashboard')
  }) 

}

ui <- bootstrapPage(
  googleSignInUI('login'),
  uiOutput('dashboard')
) 
...