Как предотвратить раскрытие моего пароля при использовании RGoogleDocs? - PullRequest
25 голосов
/ 23 мая 2011

Я люблю 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. Мне неудобно, что он отображает мой пароль для любого коллеги в моем кабинете, чтобы увидеть его. Я использовал поддельный пароль, но посмотрите на изображение. my password would be in plain view for all to see in RStudio. Кроме того, если бы я сохранил рабочее пространство, мой пароль был бы сохранен вместе с ним, и я боюсь, что я передам его кому-то другому, если через несколько месяцев, когда я давно забыл о том, что там находится, я отправлю свои .RData подать коллеге.

Я прочитал что-то общее о паролях в R в предыдущем посте . Он не дал мне достаточно информации, чтобы можно было скрыть мой пароль при использовании RGoogleDocs.

Ответы [ 7 ]

23 голосов
/ 23 мая 2011

Мой подход заключается в установке логина и пароля в списке опций R в файле запуска R .Rprofile. Тогда мой код получает значение с getOption(), а затем значение никогда не отображается и не сохраняется в переменной верхнего уровня в globalenv(). (Это можно сохранить, если каждый выполняет посмертную отладку через dump.frames).

Жизненно важно, чтобы .Rprofile не мог быть прочитан никем, кроме вас.

So

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

в .Rprofile, а затем

auth = getGoogleAuth()

просто работает, так как значением по умолчанию для первого параметра является поиск опции GoogleDocsPassword.

D.

7 голосов
/ 23 мая 2011

У меня была та же проблема, и никакого реального решения. Обходной путь, который я использую, заключается в том, что я создаю учетную запись Google только для этой цели с паролем, который меня не волнует. Затем я делюсь документами, к которым я хочу получить доступ R, с этой учетной записью.

Но если у кого-то есть ответ на первоначальный вопрос, меня это тоже интересует.

3 голосов
/ 05 марта 2014

Если вы действительно не хотите хранить его где-либо, то одним из решений этого является не использование переменной для пароля, возможно, даже для адреса учетной записи 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
    }
}
3 голосов
/ 05 декабря 2011

Вы можете сохранить пароль в файле на вашем компьютере, закодировать и все и вызвать его с помощью чего-то вроде

getPassword <- функция (файл = местоположение файла пароля) {<em> unencode (readLines (файл))}

установите это в своем .Rprofile и используйте в коде

getPassword ().

Этот пароль не сохраняется ни в одном Rфайлы, и вы можете встроить проверки в файл.

3 голосов
/ 23 мая 2011

Похоже, что вы можете сохранить пароль в ваших настройках и вместо "ps" напрямую использовать "getOption". Вроде бы есть и лучшие решения.

2 голосов
/ 23 мая 2011

Для таких вещей я делюсь документом Google с вымышленным адресом электронной почты, создаю аккаунт Google и затем использую его для обмена и авторизации Таким образом, отделив мои личные данные для входа в систему от того, что необходимо для запуска скрипта.

0 голосов
/ 10 июля 2011

как насчет двухэтапной аутентификации с паролем для конкретного приложения? Вы можете использовать специальный пароль приложения, не раскрывая свой реальный. и вы можете отозвать его, если хотите!

...