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

部署至shinyapps.io的Shiny应用对接Sharepoint加载.rda文件问题

解决方案

核心问题是认证模式不匹配:本地RStudio运行时Microsoft365R会调用本地已缓存的微软账号交互式登录凭证,而shinyapps.io属于无用户交互的远程服务环境,没有本地登录态,默认的交互式认证逻辑直接失效。

直接使用以下非交互式认证工作流即可解决:

步骤1:配置Azure AD服务主体

首先在Azure Active Directory中注册专用的服务主体作为应用访问Sharepoint的身份凭证:

  • 登录Azure门户进入「Azure Active Directory」,选择「注册应用」,填写基础信息完成注册
  • 注册完成后保存3个核心信息:租户ID、客户端ID
  • 进入「证书和密码」板块生成新的客户端密码,保存生成的密钥值
  • 进入「API权限」板块,添加Sharepoint的应用权限(注意不要选委托权限),根据需求配置Sites.Read.All或Sites.Selected权限,提交后点击「授予管理员同意」完成授权
  • 进入目标Sharepoint站点,给该服务主体分配对应目录/文件的读取权限

步骤2:配置shinyapps.io环境变量

不要把凭证硬编码到代码中,直接在shinyapps.io应用管理页面的「设置」-「环境变量」板块添加三个变量:

  • AZURE_TENANT_ID:第一步保存的租户ID
  • AZURE_CLIENT_ID:第一步保存的客户端ID
  • AZURE_CLIENT_SECRET:第一步保存的客户端密码
    保存后重启应用生效,变量会自动注入到应用运行环境中。

步骤3:修改代码使用非交互式认证

修改原有代码为非交互式认证逻辑即可正常运行,参考代码如下:

library(shiny)
library(Microsoft365R)
library(AzureAuth)

# 非交互式获取Azure认证token
token <- get_azure_token(
  resource = "https://graph.microsoft.com",
  tenant = Sys.getenv("AZURE_TENANT_ID"),
  app = Sys.getenv("AZURE_CLIENT_ID"),
  password = Sys.getenv("AZURE_CLIENT_SECRET"),
  auth_type = "client_credentials"
)

# 传入token连接Sharepoint站点
site <- get_sharepoint_site(
  site_id = "idOfTheSharepointSite",
  token = token
)
docs <- site$get_drive()

# 加载rda文件可选方案:直接读取到内存无需写入磁盘
rda_obj <- docs$get_item("Stuff/DelSet.Rda")$load()

# 也可以沿用原有下载逻辑,shinyapps.io当前工作目录支持写入,无需修改路径
# docs$download_file("Stuff/DelSet.Rda", overwrite = TRUE)
# load("DelSet.Rda")

ui <- fluidPage(h5("Hello world!"))

server <- function(input, output) {}
shinyApp(ui = ui, server = server)

注意事项

  • 如果使用Sites.Selected权限,需要额外给服务主体分配目标Sharepoint站点的访问权限,否则会提示无访问权限
  • 认证token过期会自动刷新,无需额外处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:36:03