我有一个闪亮的应用程序,需要用户登录才能访问基础数据集。
用户名和密码从表单字段中收集,并通过另一台服务器上的RESTful API提交,以获取将来请求中使用的访问令牌。我没有在这个例子中包含这些细节。
我想让网络浏览器记住登录详细信息并自动登录,但不太清楚如何。
在我的第一个实施中,<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;
答案 0 :(得分:6)
我正在寻找类似的东西,而trestletech的精彩包shinyStore
为我工作。
它为您闪亮的应用中的任何数据启用HTML5客户端数据存储。
您可能希望阅读自述文件中的“安全性”部分,并确保其安全性足以满足您的需要。
答案 1 :(得分:2)
我相信您可以使用postForm()
包中的RCurl
执行常规HTTP表单提交请求(除非Shiny
会干扰此功能,该功能基于使用基础libcurl
1}}库)。有关示例代码,请参阅我的R模块“getSourceForgeData.R”中的函数srdaLogin()
:https://github.com/abnova/diss-floss/blob/master/import/getSourceForgeData.R。