Подтвердить что ты не робот

Как получить хранилище паролей в браузере для запоминания паролей R/Shiny?

Проблема

У меня есть блестящее приложение, которое требует входа пользователя для доступа к базовому набору данных.

Имя пользователя и пароль собираются из полей формы и передаются через RESTful API на другом сервере для получения токена доступа, который используется в будущих запросах. Я не включил эти детали в этот пример.

enter image description here

Я хочу, чтобы веб-браузер помнил данные для входа и автоматически входил в систему, но не может понять, как это сделать.

Что я пробовал

В моей первой реализации страницы <input type="text" name="username"> и <input type="password" name="password"> плюс actionButton были динамически добавлены на страницу. Это заставило пользователя повторно войти в систему каждый раз, когда блестящее приложение было перезапущено, что было сложным для разработки и неприятным для пользователей.

Затем я нашел https://gist.github.com/kostiklv/968927, в котором подробно описаны условия для того, чтобы веб-браузер помнил пароль и входил в систему.

Блестящий работает на одной странице, поэтому у меня не может быть отдельной страницы входа (это создаст новый блестящий сеанс, отменив логин!).

Я пробовал различные комбинации вещей, вот самое близкое, что у меня есть. Этот script правильно заполняет прошлый пароль, но пользователю все равно придется вручную нажать submit.

Пример кода

Обратите внимание, что у меня есть пользовательский взломать мой блеск, чтобы позволить 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 и ввести пароль $для достижения кода сервера, но...

Чтобы включить как обычный вход пользователя, так и автоматический вход в систему, мне нужна кнопка, чтобы избежать повторных попыток аутентификации (что может вызвать проблемы) для частичных имен пользователей и паролей.

Журнал о том, что произошло

Вот консольные журналы из тестов

Журнал с кнопкой отправки:

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

Журнал без кнопки отправки

Комментарий     теги $input (id = "loginButton", class= "btn btn-primary", type = "submit", value = "Login" ) и предыдущая запятая

обратите внимание, что вы можете сейчас сообщить своему браузеру о забытых паролях веб-сайтов.

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 Поле пароля с использованием R Shiny framework

4b9b3361

Ответ 1

Я искал что-то подобное, и trestletech фантастический пакет shinyStore работал у меня.

Он позволяет хранить данные на клиентской стороне HTML5 для любых данных в вашем блестящем приложении.

Страница github здесь, а пример того, как она работает, здесь.

Вы можете прочитать раздел "Безопасность" в README и убедиться, что он достаточно безопасен для ваших целей.

Ответ 2

Я считаю, что вы можете использовать пакет postForm() из RCurl для выполнения обычного запроса на отправку формы HTTP (если Shiny не будет вмешиваться в эту функциональность, основанную на использовании базовой библиотеки libcurl). Для примера кода см. Функцию srdaLogin() в моем модуле "getSourceForgeData.R": https://github.com/abnova/diss-floss/blob/master/import/getSourceForgeData.R.