39

我想在网络上发布一个 R Shiny Web 应用程序 ( http://www.rstudio.com/shiny/ ),但我想用密码保护它,这样只有拥有凭据的人才能查看我发布的内容。做这个的最好方式是什么 ?

4

7 回答 7

24

这可能有点晚了,但无论如何我都会回答。如果您已经有了解决方案,可以与我们分享吗?

我的主要目标很简单。我的笔记本电脑上有一个闪亮的应用程序的工作版本。我曾经如下所述运行它,一直在本地进行测试。

R -e "shiny::runApp('.')"

然后是我们不得不将它放到 Amazon EC2 实例上的时刻。

起初我的尝试是直接将 apache 代理到我的应用程序将监听的端口 8100。但这并没有那么好,因为以这种方式运行服务器似乎实际上使用了原始套接字,而使用闪亮服务器则回退到使用 sock.js,因此现在通过 HTTP 进行通信。

因此,按照此处的说明在我们的 EC2 实例上下载了闪亮服务器应用程序:https ://github.com/rstudio/shiny-server

顺便说一句,虽然那里的说明建议您在使用 RHEL 实例时从源代码安装 node.js,但通过 yum 安装方式对我来说效果很好。你有这些说明在这里。

在 node.js、shiny-server 安装和设置之后,编辑了我的 Apache conf(Ubuntu 和 RHEL 以不同的方式调用 conf。因此编辑你拥有的那个)。添加了一个虚拟主机来服务我的请求。正如您所注意到的,还使用带有 Apache Location 指令的 Apache Basic digest Auth 掩盖了它。

<VirtualHost *:80>

    ProxyPass / http://localhost:3838/
    ProxyPassReverse / http://localhost:3838/
    ProxyPreserveHost On

    <Location />
        AuthType Basic
        AuthName "Restricted Access - Authenticate"
        AuthUserFile /etc/httpd/htpasswd.users
        Require valid-user
    </Location>

</VirtualHost>

除此之外,还编辑了 shiny-server conf 以仅侦听来自 127.0.0.1 的请求(仅限本地主机)。所以在我的闪亮服务器中,我有以下内容:

listen 3838 127.0.0.1;

顺便说一句,如果您在 Amazon EC2 环境中,则不需要此设置,因为您可以使用 EC2 控制面板中的安全组设置来执行相同操作。无论如何,我这样做是一个很好的措施。

现在,这已经足够了,因为我们正在寻找一些非常快速和简单的东西。

现在急切地等待令人敬畏的 RShiny 人员提供身份验证作为企业版交易的一部分。

希望这可以帮助。

于 2013-10-15T13:06:04.813 回答
10

这对于 OP 来说可能有点晚了,但它可能对您的用例有用:

https://auth0.com/blog/2015/09/24/adding-authentication-to-shiny-open-source-edition/

它类似于 Rohith 的答案,但它使用 Auth0 代替,它允许您使用更多身份验证选项(如连接、Google 帐户、Active Directory、LDAP 等等)

免责声明:我在 Auth0 工作,我们在内部使用 Shiny 进行此配置,它工作正常。

于 2015-09-24T18:32:06.610 回答
5

稍后(2016 年),但我发现了另一个使用ngnix作为代理的选项:

本指南已通过部分遵循本指南完成:https: //support.rstudio.com/hc/en-us/articles/213733868-Running-Shiny-Server-with-a-Proxy

在 Ubuntu 14.04 上:

  1. 安装 nginx
  2. 将文件配置 /etc/nginx/nginx.conf 更改为:

这个:

events {
        worker_connections 768;
        multi_accept on;
}

http {

  map $http_upgrade $connection_upgrade {
      default upgrade;
      ''      close;
    }

  server {
    listen XX;



    location / {
      proxy_pass http://localhost:YY;
      proxy_redirect http://localhost:YY/ $scheme://$host/;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      proxy_read_timeout 20d;

      auth_basic "Restricted Content";
      auth_basic_user_file /etc/nginx/.htpasswd;
    }
  }
}

XX: nginx 监听的端口

YY:闪亮服务器使用的端口

  1. 使用本教程,我向 nginx 服务器添加了密码验证:https ://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-nginx-on-ubuntu-14-04

  2. 设置闪亮的进程或闪亮的服务器只听本地主机(127.0.0.1)

于 2016-02-04T09:58:13.280 回答
2

这可以被视为一项HTTP要求而不是一项Shiny功能。如果是这样,您可以考虑首先实现 HTTP 身份验证,一旦验证了凭据,您就可以重定向到您的 Shiny 应用 URL。

在 SO 或 Web 上搜索基本身份验证应该会为您提供一些有用的链接并让您更接近。

于 2013-08-19T23:18:30.193 回答
1

目前还没有直接的方法可以做到这一点。不过,我们将在不久的将来发布 Shiny Server 的商业版本。我们将在接下来的一个月左右进行测试,并在年底前发布正式版本。这将包括为您的 Shiny 应用程序进行密码验证的能力。此外,Shiny Server Pro 将具有安全性、身份验证、可扩展性、服务器监控和高级支持等功能。

您可能会得到一些反馈的另一个地方是闪亮的邮件列表。有很多活跃用户可能有一些想法。否则,如果您想就此直接与我们联系,您可以发送电子邮件至 info@rstudio.com,我会回复。

最好的,

乔什

产品经理 - RStudio

于 2013-08-19T14:44:29.853 回答
1

答案为时已晚,但我认为,同样有发展。您可以使用 google auth 登录闪亮的网络应用程序。在不同的线程上有一个解决方案,您可以参考:ShinyApp Google Login

于 2020-03-16T02:02:27.837 回答
0

我们已经实现了具有多级身份验证的解决方案:

  1. 使用基于查询字符串的值来加载应用程序

    • 基于时间的加密令牌将在未来的某个时间点到期
    • 用户名(在下一个身份验证步骤中使用)
  2. 验证访问代码的模式对话框

    • 已针对用户名的 AES 加密值进行验证

参考:CRAN - 摘要 -> AES对两个级别使用 CBC 模式,加密密钥(32 字节原始向量)和长 IV

于 2021-09-23T19:22:00.997 回答