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)
我相信您可以使用postForm()fromRCurl包来执行常规 HTTP 表单提交请求(除非Shiny会干扰此功能,该功能基于使用底层libcurl库)。有关示例代码,请参阅srdaLogin()我的 R 模块“getSourceForgeData.R”中的函数: https: //github.com/abnova/diss-floss/blob/master/import/getSourceForgeData.R。
| 归档时间: |
|
| 查看次数: |
3663 次 |
| 最近记录: |