无法持续googleAuthR登录会话

时间:2019-06-14 09:13:38

标签: r shiny google-authentication

我使用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')
) 

0 个答案:

没有答案