使用Azure交互式认证时R Markdown编译失败求助
问题
我需要通过多因素认证连接SQL数据库,以下代码在普通R脚本中可正常运行:
server <- "xxx" database <- "yyy" user <- "zzz" conn <- dbConnect(odbc(), Driver = "ODBC Driver 17 for SQL Server", Server = server, Database = database, UID = rstudioapi::askForPassword(user), Authentication = "ActiveDirectoryInteractive", Port = 1433)
但在使用R Markdown生成报告时,编织文件初始看似正常,输入密码后编译停滞在18%,无报错但始终无法完成编译。
解决方案
方法1:预先获取AD认证token,采用非交互式连接
R Markdown编织过程属于非交互式环境,ActiveDirectoryInteractive依赖弹出的交互式验证窗口完成MFA,这会导致编织进程阻塞。可以通过AzureAuth包提前获取认证token,再用token建立连接:
library(AzureAuth) library(odbc) # 获取AD认证token(首次运行会弹出验证窗口完成MFA) token <- get_azure_token( resource = "https://database.windows.net/", tenant = "你的租户ID", app = "你的客户端ID", auth_type = "authorization_code" ) # 使用token连接数据库 server <- "xxx" database <- "yyy" conn <- dbConnect(odbc(), Driver = "ODBC Driver 17 for SQL Server", Server = server, Database = database, UID = "zzz", Authentication = "ActiveDirectoryAccessToken", AccessToken = token$credentials$access_token, Port = 1433 )
方法2:强制编织时使用交互式会话
在R Markdown文档开头添加以下设置,让编织过程启用交互式模式,确保MFA验证窗口能正常弹出:
knitr::opts_chunk$set(echo = TRUE, eval = interactive())
注意:这种方法需要手动参与验证流程,不适合自动化批量编织场景。
方法3:升级ODBC驱动并调整认证方式
升级到ODBC Driver 18 for SQL Server,尝试使用ActiveDirectoryPassword认证方式(如果你的MFA支持密码+二次验证的组合):
server <- "xxx" database <- "yyy" user <- "zzz" conn <- dbConnect(odbc(), Driver = "ODBC Driver 18 for SQL Server", Server = server, Database = database, UID = user, Authentication = "ActiveDirectoryPassword", Password = rstudioapi::askForPassword("输入密码"), Port = 1433, TrustServerCertificate = TRUE )
内容的提问来源于stack exchange,提问作者Pernille Draborg
相关产品推荐
相关产品推荐

