2011-05-23 18 views
25

Me encanta RGoogleDocs y lo uso mucho. Sin embargo, no me gusta ingresar mi contraseña todo el tiempo. Obviamente, podría simplemente escribir la contraseña en el guión R y nunca más volvería a ingresarla. Pero eso no es viable, ya que significa que mi contraseña no se cifrará en mi disco duro. Además, comparto mis scripts con mis colegas.¿Cómo evito la exposición de mi contraseña cuando uso RGoogleDocs?

Para solucionar el problema se me ocurrió esto.

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("[email protected]", ps, service ="wise")) 

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

Me encanta usar rstudio. Me siento incómodo porque muestra mi contraseña para cualquier colega en mi oficina a la hora de ver. Utilicé una contraseña falsa pero miro la imagen. my password would be in plain view for all to see in RStudio. Además, si guardaba un espacio de trabajo, mi contraseña se guardaba con él y me temo que se lo daría a otra persona si, unos meses más tarde, cuando ya me había olvidado de lo que contenía, le envié mi .RData archivo a un colega

He leído algo general sobre contraseñas en R en un earlier post. No me dio suficiente información para poder ocultar mi contraseña cuando uso RGoogleDocs.

+0

Si está utilizando Windows, consulte http://stackoverflow.com/a/36218700/3827849 –

Respuesta

23

Mi enfoque es configurar el inicio de sesión nombre & contraseña en la lista de opciones R dentro del archivo de inicio R .Rprofile. Entonces mi código obtiene el valor con getOption() y luego el valor nunca es visible o se almacena en una variable de nivel superior en globalenv(). (Podría guardarse si se realiza una depuración post mortem a través del dump.frames).

Es vital que el .Rprofile no pueda ser leído por nadie más que usted.

Así

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

en el .Rprofile y luego

auth = getGoogleAuth() 

simplemente funciona como el valor predeterminado para el primer parámetro es la búsqueda de la opción GoogleDocsPassword.

D.

+0

estoy un poco perdido. Supongamos que el inicio de sesión es "[email protected]" y la contraseña era "12345". La opción de cómo sería (GoogleDocsPassword = c (login = 'password')) mirar. ¿Dónde se coloca la línea auth = getGoogleAuth()? ¿Va en el Rprofile? – Farrel

+1

Después de establecer la opción GoogleDocsPassword solo una vez fuera de R en su .Rprofile, en cualquier sesión R, puede usar con = getGoogleDocsConnection() para crear una conexión. El punto es que las funciones saben cómo encontrar el nombre de usuario y la contraseña para crear pasivamente una conexión. Incluso puede usar getDocs() directamente, pero es más eficiente crear una conexión una sola vez con getGoogleDocsConnection() y pasar esto en cada una de las llamadas a las funciones de nivel superior. (De lo contrario, tendremos más comunicación con Google para crear una nueva conexión cada vez). – Duncan

+2

No haría una llamada para obtener GoogleAuth() u obtenerGoogleDocsConnection() ni nada de esa naturaleza en mi .Rprofile. ¿Por qué? Porque no usaré GoogleDocs en cada sesión R. Solo llamo getGoogleDocsConnection() cuando quiero una conexión durante esa sesión R. Establecer la opción en .Rprofile es simplemente configurar cosas para usar si son necesarias y no causar ningún problema si no lo son. – Duncan

7

Tuve el mismo problema y no tuve una solución real. La solución alternativa que uso es crear una cuenta de Google solo para este propósito, con una contraseña que no me importa. Luego comparto los documentos que quiero que R tenga acceso con esa cuenta.

Pero si alguien tiene una respuesta a la pregunta inicial, estoy interesado también.

3

Parece que podría almacenar la contraseña en sus opciones y en lugar de "ps" usar directamente "getOption". Sin embargo, hay mejores soluciones.

2

Por cosas como esta comparto el doc Google con una dirección de correo electrónico compuesto por, crear una cuenta de Google y luego usarlo para compartir y autorización. Por lo tanto, separar mis datos personales de inicio de sesión de lo que es necesario para ejecutar el script.

0

¿qué ocurre con la autenticación de 2 pasos con la contraseña específica de la aplicación? puede usar la contraseña específica de la aplicación sin revelar la verdadera. y puede revocarlo si lo desea.

3

Se puede almacenar la contraseña en un archivo en su ordenador, codificado y todo y llamarlo con algo como

getPassword < - función (file = ubicación del archivo de contraseñas) {descodifica (readlines (archivo))}

esto en su conjunto .Rprofile y uso en el código

getPassword().

Esto no almacena su contraseña en ningún archivo R y puede crear verificaciones en el archivo.

3

Si realmente no desea almacenarlo en ninguna parte, una solución a esto es no usar una variable para la contraseña, ¡incluso la dirección de la cuenta de google! Sobre la base del linked answer, por qué no probar

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 
    } 
} 
Cuestiones relacionadas