25

我喜欢RGoogleDocs并且经常使用它。但是,我不喜欢一直输入密码。显然,我只需在 R 脚本中输入密码,就不必再次输入密码了。但这不可行,因为这意味着我的密码将在我的硬盘驱动器上未加密。此外,我与同事分享我的脚本。

为了解决这个问题,我想出了这个。

if(exists("ps")){
  print("got password, keep going")
} else {
  ps <-readline(prompt="get the password in ")
}

options(RCurlOptions = list(
  capath = system.file("CurlSSL", "cacert.pem", 
  package = "RCurl"), ssl.verifypeer = FALSE)
)

sheets.con = getGoogleDocsConnection(
  getGoogleAuth("notreal@gmail.com", ps, service ="wise")) 

#WARNING: this would prevent curl from detecting a 'man in the middle' attack
ts2=getWorksheets("hpv type",sheets.con)

我喜欢使用 RStudio。我感到不舒服的是,它当时正在向我办公室的任何同事显示我的密码。我使用了假密码,但请查看图像。我的密码将在 RStudio 中清晰可见. 此外,如果我保存了一个工作区,我的密码将与它一起保存,我担心如果几个月后,当我早已忘记其中的内容时,我会将其提供给其他人,我发送了我的 .RData文件给同事。

我在较早的帖子中阅读了有关 R 中密码的一般信息。在使用 RGoogleDocs 时,它没有给我足够的信息来隐藏我的密码。

4

7 回答 7

23

我的方法是在 R 启动文件中的 R 选项列表中设置登录名和密码.Rprofile。然后我的代码使用 获取值,getOption()然后该值永远不可见或存储在globalenv(). (如果通过 进行事后调试可以节省dump.frames)。

至关重要的是,.Rprofile除了您之外的任何人都无法阅读。

所以

options(GoogleDocsPassword = c(login = 'password'))

.Rprofile然后

auth = getGoogleAuth()

只是作为第一个参数的默认值是寻找GoogleDocsPassword选项。

D.

于 2011-05-23T19:30:49.747 回答
7

我有同样的问题,没有真正的解决方案。我使用的解决方法是,我为此目的创建了一个谷歌帐户,并使用我不关心的密码。然后,我共享我希望 R 使用该帐户访问的文档。

但是,如果有人对最初的问题有答案,我也很感兴趣。

于 2011-05-23T19:11:43.027 回答
3

似乎您可以将密码存储在您的选项中,而不是“ps”直接使用“getOption”。不过可能有更好的解决方案。

于 2011-05-23T19:28:22.410 回答
3

您可以将密码存储在计算机上的文件中,编码和所有,然后用类似的东西调用它

getPassword <- function(file = 密码文件的位置){ unencode (readLines(file))}

在您的 .Rprofile 中设置它并在代码中使用

获取密码()。

这不会将您的密码存储在任何 R 文件中,您可以在文件中构建检查。

于 2011-12-05T11:08:55.107 回答
3

如果您真的不想将其存储在任何地方,那么解决此问题的一种方法是不要使用变量作为密码,甚至可能是 google 帐户地址!基于链接的答案,为什么不尝试

library(tcltk)
library(RGoogleDocs)

getHiddenText <- function(label = "Enter text:", symbol = "*", defaultText = ""){  
    wnd <- tktoplevel()
    entryVar <- tclVar(defaultText)  
    tkgrid(tklabel(wnd, text = label))
    #Entry box
    tkgrid(entryBox <- tkentry(wnd, textvariable = entryVar, show = symbol))
    #Hitting return will also submit text
    tkbind(entryBox, "<Return>", function() tkdestroy(wnd))
    #OK button
    tkgrid(tkbutton(wnd, text="OK", command=function() tkdestroy(wnd)))
    #Wait for user to submit  
    tkwait.window(wnd)
    return(tclvalue(entryVar))
}  

repeat {
    con <- try(getGoogleDocsConnection(getGoogleAuth(
        getHiddenText(
            label = "Enter google account:",
            symbol = "", # or set to "*" to obscure email entry
            defaultText = "@gmail.com"), # a little timesaver
        getHiddenText(
            label = "Enter password:",
            symbol = "*",
            defaultText = ""),
        service = "wise")))
    if (inherits(con, "try-error")) {
        userResponse <- tkmessageBox(
            title = "Error",
            message = "Couldn't connect to Google Docs. Try again?",
            icon = "error", type = "yesno")
        if (tclvalue(userResponse) == "no") {
            stop("Unable to connect to Google Docs, user cancelled.")
        }        
    } else { # connection successfully authenticated
        break() # so escape the repeat loop
    }
}
于 2014-03-05T19:33:27.640 回答
2

对于这样的事情,我用一个虚构的电子邮件地址共享谷歌文档,创建一个谷歌帐户,然后将其用于共享和授权。因此,将我的个人登录详细信息与脚本运行所需的内容分开。

于 2011-05-23T19:43:58.963 回答
0

使用特定于应用程序的密码进行两步身份验证怎么样?您可以使用应用程序专用密码,而无需透露您的真实密码。如果你愿意,你可以撤销它!

于 2011-07-09T21:02:33.663 回答