部署至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:第一步保存的租户IDAZURE_CLIENT_ID:第一步保存的客户端IDAZURE_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
相关产品推荐
相关产品推荐

