如何获取Web浏览器密码存储以记住R / Shiny密码?

时间:2014-01-14 18:46:43

标签: r authentication shiny

问题

我有一个闪亮的应用程序,需要用户登录才能访问基础数据集。

用户名和密码从表单字段中收集,并通过另一台服务器上的RESTful API提交,以获取将来请求中使用的访问令牌。我没有在这个例子中包含这些细节。

enter image description here

我想让网络浏览器记住登录详细信息并自动登录,但不太清楚如何。

我尝试了什么

在我的第一个实施中,<input type="text" name="username"><input type="password" name="password">以及actionButton被动态添加到页面中。这使得用户每次重新启动闪亮的应用程序时都会重新登录,这对于开发来说很复杂并且对用户来说是不愉快的。

然后我发现https://gist.github.com/kostiklv/968927详细说明了让网络浏览器记住密码并登录的条件。

Shiny在一个页面上工作,所以我没有一个单独的登录页面(这会产生一个新的闪亮会话,丢弃登录!)。

我尝试了各种各样的组合,这里是我最接近的。此脚本正确填写过去的密码,但用户仍需手动点击提交。

示例代码

请注意,我有一个自定义黑客入侵,以使type="password"type="text"一样对待。有关访问此代码的信息,请参阅问题的底部

将此代码保存为login.R,然后运行R并输入source("login.R")

write("","blank.html")
require(shiny)
addResourcePath("login",tools:::file_path_as_absolute("./"))
runApp(list(
  ui=bootstrapPage(
    tags$form(action="#",target="loginframe",
      tags$input(id="username",type="text",placeholder="Username"),
      tags$input(id="password",type="password",placeholder="Password"),
      tags$input(id="loginButton",class="btn btn-primary",type="submit",value="Login")
    ),
    tags$iframe(name="loginframe",src="login/blank.html",style="display:none")
  ),
  server=function(input, output) {
    observe({message(
        "username ",input$username,"\n",
        "password ",input$password,"\n"
    )})
  })
)

分析发生的事情

请注意,html input submit button的存在似乎表明它应该只在每次提交时更新输入。没有提交按钮,闪烁会在每次按键时更新其输入。

闪亮的submitButton也是如此。

离开表单但删除按钮允许输入$ username并输入$ password来访问服务器代码,但是......

要启用传统的用户登录和自动登录,我需要使用该按钮以避免重复尝试对部分用户名和密码进行身份验证(这可能会导致问题)。

记录发生的事情

以下是测试中的控制台日志

使用提交按钮记录:

username 
password 
<enter username AA and password BB>
*no update*
<hit submit>
*browser requests to save password / yes*
username A
password B
<refresh page>
username 
password
* onscreen form inputs are populated *
<hit submit>
username A
password B

没有提交按钮的日志

评论出来       tags $ input(id =“loginButton”,class =“btn btn-primary”,type =“submit”,value =“Login”) 和前面的逗号

请注意,您现在可能想告诉您的浏览器忘记localhost网页密码。

username
password
<enter username AA and password BB>
username A
password
username AA
password
username AA
password B
password BB
<refresh browser>
* onscreen form inputs are not populated *
* browser requests to save password *
username
password
<refresh browser>
* onscreen form inputs are populated *
username
password
username AA
username BB

启用密码处理的闪亮补丁:

使用library(devtools)

安装
install_github("shiny","alexbbrown",ref="password-field")

或手动下载并安装:

https://github.com/alexbbrown/shiny.git (branch password-field)

或手动修补你的光泽:

index 9b63c7b..15377d8 100644
--- a/inst/www/shared/shiny.js
+++ b/inst/www/shared/shiny.js
@@ -1336,7 +1336,7 @@
   var textInputBinding = new InputBinding();
   $.extend(textInputBinding, {
     find: function(scope) {
-      return $(scope).find('input[type="text"]');
+      return $(scope).find('input[type="text"],input[type="password"]');
     },
     getId: function(el) {
       return InputBinding.prototype.getId.call(this, el) || el.name;

cf Password field using R Shiny framework

2 个答案:

答案 0 :(得分:6)

我正在寻找类似的东西,而trestletech的精彩包shinyStore为我工作。

它为您闪亮的应用中的任何数据启用HTML5客户端数据存储。

github页面为here,其工作原理示例为here

您可能希望阅读自述文件中的“安全性”部分,并确保其安全性足以满足您的需要。

答案 1 :(得分:2)

我相信您可以使用postForm()包中的RCurl执行常规HTTP表单提交请求(除非Shiny会干扰此功能,该功能基于使用基础libcurl 1}}库)。有关示例代码,请参阅我的R模块“getSourceForgeData.R”中的函数srdaLogin()https://github.com/abnova/diss-floss/blob/master/import/getSourceForgeData.R