You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Golem化的R Shiny应用中中途实现Auth0登录?

实现“先试用后登录解锁”的Auth0认证方案

核心思路

放弃用auth0::shinyAppAuth0直接包裹整个应用的方式,转而在Golem应用的UI和Server层手动集成Auth0认证逻辑:

  • 应用启动时默认展示所有基础功能,同时提供登录按钮
  • 用户点击登录后,触发Auth0授权流程
  • 登录成功后,获取用户信息并解锁受限功能

具体实现步骤

1. 修改run_app.R脚本

不再使用auth0::shinyAppAuth0,改用标准的shiny::shinyApp,保留Golem的with_golem_options包裹:

run_app <- function(
  onStart = NULL,
  options = list(),
  enableBookmarking = NULL,
  uiPattern = "/",
  port = 8080,
  ...
) {
  options(shiny.port = port)
  with_golem_options(
    app = shiny::shinyApp(
      ui = app_ui,
      server = app_server,
      onStart = purrr::partial(eval, expr = global, envir = globalenv()),
      options = options,
      enableBookmarking = enableBookmarking,
      uiPattern = uiPattern
    ),
    golem_opts = list(...)
  )
}

2. 在app_ui.R中添加登录按钮和状态控制

在UI中区分基础功能区和受限功能区,用shinyjs控制受限功能的显示/隐藏:

app_ui <- function(request) {
  tagList(
    shinyjs::useShinyjs(),
    fluidPage(
      titlePanel("先试用后登录应用"),
      actionButton("login_btn", "登录解锁完整功能"),
      hr(),
      # 基础功能区(默认可见可用)
      h3("基础功能"),
      plotOutput("basic_plot"),
      # 受限功能区(默认隐藏)
      h3("完整功能(需登录)"),
      shinyjs::hidden(
        div(
          id = "premium_section",
          plotOutput("premium_plot"),
          downloadButton("download_data", "导出数据")
        )
      )
    )
  )
}

3. 在app_server.R中集成Auth0登录逻辑

使用auth0::auth0_server处理登录回调,同时管理用户登录状态:

app_server <- function(input, output, session) {
  # 初始化Auth0配置(和之前用shinyAppAuth0时的配置一致)
  auth_config <- auth0::auth0_config(
    auth0_domain = Sys.getenv("AUTH0_DOMAIN"),
    auth0_client_id = Sys.getenv("AUTH0_CLIENT_ID"),
    auth0_client_secret = Sys.getenv("AUTH0_CLIENT_SECRET"),
    auth0_redirect_uri = Sys.getenv("AUTH0_REDIRECT_URI")
  )

  # 处理Auth0登录和回调
  auth_result <- auth0::auth0_server(input, auth_config)

  # 登录按钮点击事件:触发Auth0授权跳转
  observeEvent(input$login_btn, {
    auth0::auth0_login(session, auth_config)
  })

  # 监听登录状态变化,解锁受限功能
  observe({
    req(auth_result$user())
    shinyjs::show("premium_section")
    # 可根据用户角色做更细粒度控制,比如:
    # user_info <- auth_result$user()
    # if (user_info$roles == "admin") { ... }
  })

  # 基础功能示例
  output$basic_plot <- renderPlot({
    plot(mtcars$mpg, mtcars$wt)
  })

  # 受限功能示例(加登录校验)
  output$premium_plot <- renderPlot({
    req(auth_result$user())
    ggplot2::ggplot(mtcars, ggplot2::aes(mpg, wt, color = gear)) + ggplot2::geom_point()
  })

  output$download_data <- downloadHandler(
    filename = function() { "mtcars_data.csv" },
    content = function(file) {
      req(auth_result$user())
      write.csv(mtcars, file)
    }
  )
}

4. Posit Connect部署注意事项

  • 在Posit Connect的应用环境变量中配置AUTH0_DOMAIN、AUTH0_CLIENT_ID、AUTH0_CLIENT_SECRET、AUTH0_REDIRECT_URI(Redirect URI需设为应用完整URL加/auth0-callback)
  • 将应用访问权限设为“公开”,允许未登录用户访问基础功能

关键说明

  • 该方案完全可行,核心是把Auth0认证逻辑从应用入口移到内部,通过按钮触发授权
  • 所有受限功能的Server逻辑需用req(auth_result$user())做安全校验,防止未登录用户绕过限制
  • 可通过shinyjs实现更灵活的UI控制,比如禁用按钮而非隐藏,或根据用户角色展示不同功能

内容的提问来源于stack exchange,提问作者Kia Mack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 18:43:09