我使用googleAuthR模块为Shiny应用创建了通用的登录流程。 登录过程按预期工作,但在重新加载页面时仍无法保持会话状态。
这些googleAuthR模块初始化选项可能与该问题有关(阅读各种文档):rovaling_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
关于如何解决此问题的想法/提示?
已解决:
googleAuthR
库随附一个名为googleSignIn
的模块,该模块比其祖先可以更好地处理简单的登录流程。
如果有人需要在登录墙后放置内容,这是一个简单的设置:
server <- function(input, output, session) {
loggedIn <- callModule(googleSignIn, 'login')
observe({
req(loggedIn())
callModule(onlyForLoggedInUsers, 'dashboard')
})
}
ui <- bootstrapPage(
googleSignInUI('login'),
uiOutput('dashboard')
)