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

Ale*_*own 35 authentication r shiny

问题

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

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

在此输入图像描述

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

我尝试了什么

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

然后我找到了https://gist.github.com/kostiklv/968927,其中详细说明了让Web浏览器记住密码并登录的条件.

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

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

示例代码

请注意,我有一个自定义黑客我的闪亮,以使得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"
    )})
  })
)
Run Code Online (Sandbox Code Playgroud)

分析发生了什么

请注意,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
Run Code Online (Sandbox Code Playgroud)

没有提交按钮的日志

注释掉标签$ 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
Run Code Online (Sandbox Code Playgroud)

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

安装使用 library(devtools)

install_github("shiny","alexbbrown",ref="password-field")
Run Code Online (Sandbox Code Playgroud)

或手动下载和安装:

https://github.com/alexbbrown/shiny.git (branch password-field)
Run Code Online (Sandbox Code Playgroud)

或手动修补你的闪亮:

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;
Run Code Online (Sandbox Code Playgroud)

cf 使用R Shiny框架的密码字段

Ham*_*ake 6

我正在寻找类似的东西,而trestletech的精彩包装shinyStore对我有用.

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

github页面在这里,它的工作原理就在这里.

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


Ale*_*ekh 2

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