保护 .Rprofile 中私有 R 存储库的凭据

Aid*_*len 6 authentication authorization r credentials cran

与 python pip 不同,R 似乎公开了为.Rprofile. 我想这是因为 R 将字符串视为 URL。

local({r <- getOption("repos")
       r["Nexus"] <- "https://username:password@my-private-r-repo.com/repository/r-group"
       options(repos=r)
})
Run Code Online (Sandbox Code Playgroud)

然后当我安装包时:

> install.packages("shinydashboard")
trying URL 'https://username:password@my-private-r-repo.com/repository/r-group/bin/macosx/el-capitan/contrib/3.6/shinydashboard_0.7.1.tgz'
Content type 'application/x-tgz' length 326031 bytes (318 KB)
==================================================
downloaded 318 KB


The downloaded binary packages are in
    /var/folders/7_/pt_pgg2j531f2jc_n5znht600000gn/T//RtmpZkpXkN/downloaded_packages
Run Code Online (Sandbox Code Playgroud)

R 是否有配置选项来防止凭据泄露?

Ris*_*aor 1

我使用renv 和 Authorization header解决了这个问题(以及其他问题)。
renv帮助您为 R 项目创建虚拟环境,锁定项目中使用的所有包(及其版本)。
您可以在此处阅读有关身份验证标头的信息:Web API 身份验证基本与承载

.Rprofile您可以通过向项目添加文件来使 renv 与私有存储库一起使用,如下所示:

source("renv/activate.R")
local({
  project_repos <- c(
    CRAN = "https://cloud.r-project.org",
    PRIVATE_CRAN = "https://your-private-cran.io"
    )

  options(repos = project_repos)
  options(
    renv.download.headers = function(url) {
      if (grepl(paste0("^", project_repos["PRIVATE_CRAN"]), url))
        return(c(Authorization = paste0("Bearer", Sys.getenv("AUTH_TOKEN"))))
    })
Run Code Online (Sandbox Code Playgroud)

每次您从私有 CRAN 访问文件时,这都会自动添加授权标头。
如果满足了所有先决条件,安装包将如下所示:

> renv::install("private_packge@2.7.2")
Retrieving 'https://your-private-cran.io/Cran-local/src/contrib/Archive/private_packge/2.7.2/private_packge_2.7.2.tar.gz' ...
    OK [file is up to date]
Installing private_packge [2.7.2] ...
    OK [built from source]
Moving private_packge [2.7.2] into the cache ...
    OK [moved to cache in 1.3 milliseconds]
Run Code Online (Sandbox Code Playgroud)

前提条件是:

  1. 为您的项目安装并配置renv
  2. 您的私有 CRAN 应该能够接受授权标头。
  3. 身份验证令牌存储在名为 的环境变量中AUTH_TOKEN
  4. 请注意,我使用Bearer身份验证,这意味着我从我的私有 CRAN 获得了专用令牌。如果您想使用username:password,那么您需要使用基本身份验证,并且调用的环境变量AUTH_TOKEN应该是 的 base64 编码username:password