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

R-Shiny集成Azure AD认证后无法加载预期图表求助

解决Shiny应用Azure AD认证后空白屏问题

以下是针对你代码的具体修复建议:

1. 修正回调URL的空格问题

你的redirect变量开头存在空格,会导致Azure回调失败,直接移除空格:

redirect <- "https://flashdrought.shinyapps.io/Flash_tool/"

2. 重构认证逻辑,移出renderPlot

将认证流程从renderPlot中剥离,放在server初始化阶段,用reactive对象存储token和OneDrive连接,避免重复认证,同时解决初始无code时直接return导致的空白:

server <- function(input, output, session) {
  # 依赖包移至server函数开头,避免重复加载
  library(terra)
  library(RColorBrewer)
  library(spData)
  library(tmap)

  # 处理认证逻辑
  auth_token <- reactive({
    opts <- parseQueryString(isolate(session$clientData$url_search))
    if (is.null(opts$code)) {
      # 未认证时跳转至Azure登录页
      auth_url <- build_authorization_url(
        resource = c("https://graph.microsoft.com/.default", "offline_access"),
        tenant = tenant,
        app = app,
        redirect_uri = redirect,
        version = 2
      )
      session$sendCustomMessage("redirect", auth_url)
      return(NULL)
    }
    # 获取token,仅请求必要权限
    get_azure_token(
      c(
        "https://graph.microsoft.com/Files.Read.All",
        "offline_access"
      ),
      tenant = tenant,
      app = app,
      auth_type = "authorization_code",
      authorize_args = list(redirect_uri = redirect),
      version = 2,
      auth_code = opts$code
    )
  })

  # 初始化OneDrive连接
  od <- reactive({
    req(auth_token())
    get_personal_onedrive(token = auth_token())
  })

  # 绑定按钮触发数据下载
  plot_data <- eventReactive(input$goButton, {
    dataSelect <- format(as.Date(input$Date), "%Y%m%d")
    req(od())
    
    # 捕获下载错误,给用户提示
    tryCatch({
      od()$download_file(
        paste0("Public/FDSI/fdsiRas-", dataSelect, ".tif"),
        overwrite = TRUE
      )
      rast(paste0("fdsiRas-", dataSelect, ".tif"))
    }, error = function(e) {
      showNotification(paste("下载失败:", e$message), type = "error")
      return(NULL)
    })
  })

  output$distPlot <- renderPlot({
    req(plot_data())
    FDSIselect <- plot_data()
    
    cols <- colorRampPalette(
      brewer.pal(11, 'RdYlBu'),
      space = 'Lab',
      interpolate = 'spline',
      bias = 1
    )
    mypal <- cols(6)
    
    myMap <- tm_shape(FDSIselect) +
      tm_raster(
        title = "Flash Drought Stress Index",
        palette = rev(mypal),
        style = "fixed",
        breaks = c(0, 0.2, 0.4, 0.5, 0.6, 0.71, 1)
      ) +
      tm_layout(legend.position = c("left", "bottom")) +
      tm_grid(alpha = 0.2) +
      tm_xlab("Longitude", size = 1.2) +
      tm_ylab("Latitude", size = 1.2) +
      tm_layout(
        inner.margins = 0,
        legend.text.size = 1.1,
        legend.title.size = 1.2
      ) +
      tm_shape(world) +
      tm_sf(alpha = 0.25)
    
    print(myMap)
    
    # 清理临时文件
    dataSelect <- format(as.Date(input$Date), "%Y%m%d")
    file.remove(paste0("fdsiRas-", dataSelect, ".tif"))
  })
}

3. 优化权限范围

仅请求必要的Files.Read.All权限,避免过度授权,减少认证复杂度和安全风险。

4. 增加错误反馈

用tryCatch捕获下载、认证过程中的异常,通过showNotification给用户明确提示,避免无反馈的空白屏。

5. 绑定按钮触发逻辑

使用eventReactive监听goButton点击,只有用户主动触发时才执行下载和绘图,符合操作预期。

额外注意事项

  • 确保Azure AD应用注册的重定向URI与代码中的redirect完全一致,包括路径和大小写。
  • 确认OneDrive中Public/FDSI/路径存在,且授权用户拥有访问权限。
  • 部署到shinyapps.io时,若使用客户端密码,需在应用设置中配置对应的环境变量;若为单页应用,需确保应用注册类型正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:08:19