Я создал общий поток входа в систему для приложения 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')
)