shinyapps.io部署的Shiny应用通过Azure AD认证访问SharePoint站点问题
解决方案
1. Azure Active Directory配置校验
- 确认你在Azure AD注册的应用已添加对应权限:若使用Microsoft Graph访问SharePoint,需添加委托权限下的
Sites.Read.All(站点读权限)或Files.Read.All(文件读权限),权限配置完成后必须由租户管理员完成同意授权。 - 确认应用的重定向URI已正确配置为你部署在shinyapps.io的应用访问地址,平台类型选择「Web」,且已勾选「ID令牌」「访问令牌」的发放选项。
- 确认你的应用注册所属租户与企业SharePoint所属租户为同一租户。
2. SharePoint站点配置校验
- 若使用委托权限模式(即当前登录Shiny应用的用户身份访问SharePoint),确认对应登录账号已被添加到目标SharePoint站点的访问列表中,拥有目标文件/文档库的读取权限。
- 若使用应用权限模式(即应用本身身份访问SharePoint),需额外在SharePoint站点中为应用的服务主体分配对应读取权限。
3. Shiny应用R代码实现
你已经通过AzureAuth获取到了Graph资源的访问令牌,可直接通过以下两种方式访问SharePoint数据:
方式一:使用Microsoft365R包(推荐)
直接将获取到的令牌传入对应函数即可:
library(Microsoft365R) library(AzureAuth) # 你之前通过AzureAuth流程获取到的令牌对象,假设变量名为graph_token # 替换为你的SharePoint站点实际URL target_site <- get_sharepoint_site( site_url = "https://你的租户名.sharepoint.com/sites/你的站点名", token = graph_token ) # 获取目标文档库 doc_lib <- target_site$get_drive("文档库名称") # 读取目标csv数据文件,可根据文件类型调整读取逻辑 data_file <- doc_lib$get_item("文件夹路径/目标数据文件.csv") temp_path <- tempfile(fileext = ".csv") data_file$download(temp_path, overwrite = TRUE) target_data <- read.csv(temp_path)
方式二:直接调用Graph API
如果不想依赖第三方包,可直接用httr包调用Graph接口读取数据:
library(httr) library(jsonlite) # 替换为你的站点ID、文档库ID、文件路径 graph_url <- "https://graph.microsoft.com/v1.0/sites/你的站点ID/drives/你的文档库ID/root:/目标文件路径.csv:/content" resp <- GET( graph_url, add_headers(Authorization = paste0("Bearer ", graph_token$credentials$access_token)) ) target_data <- read.csv(text = content(resp, "text"))
常见问题排查
- 若调用接口返回401无权限,可先解码你的访问令牌,确认
scp字段中包含你配置的SharePoint/Graph对应权限,若没有则需要重新走授权流程获取令牌。 - 若返回403禁止访问,确认当前登录账号/应用服务主体有目标站点的对应访问权限。
- 如果你后续需要调用SharePoint原生REST API,需要将AzureAuth中的resource参数修改为
"https://你的租户名.sharepoint.com",同时在Azure AD应用中添加SharePoint对应的权限即可。
内容的提问来源于stack exchange,提问作者Leo Timmermans
相关产品推荐
相关产品推荐

