R使用AWS Cognito进行Shiny身份验证

Den*_*tes 10 authentication r shiny shiny-server amazon-cognito

我正在将R Studio Server与R Shiny结合使用,在Ubuntu 16.04上运行.一切正常.我想要保护R Shiny仪表板(用户名+ pw),我正在考虑建立一个与AWS Cognito通信的小网页来验证用户.

我找不到任何关于这种组合的文档(Shiny + Cognito),但确实找到了一些关于R Shiny Authentication(使用NGINX + Auth0)和Cognito(例如与NodeJS结合使用)的文档.

Shiny和Cognito(例如PHP或Node JS)的组合是逻辑和安全的吗?什么是最好的方法:一个简单的网页与一些PHP,或一个Node JS应用程序,其中包含Shiny?

我意识到这个问题相当广泛,但是因为我确信我不是唯一一个在这个问题上走来走去的人,所以我仍然要求所有人都能从可能的解决方案中获益.

asa*_*ica 5

这是我实施的设置的描述。这是使用 AWS Cognito 以及 AWS 特定的功能。

上下文:我有一堆光泽的应用程序,包装在容器中(通常使用asachet/shiny-base或一种这些Dockerfile小号作为基础)。我想私下托管它们并控制谁可以访问它们。

下面的设置是闪亮代理的替代方案。事实上,它不需要任何闪亮的服务器。每个应用程序只依赖于shiny. 每个容器都公开一个端口(例如EXPOSE 3838),并简单地使用runApp(".", host="0.0.0.0", port=3838). 扩展策略负责根据需要启动和停止容器。身份验证逻辑与应用程序代码完全分离。

我的云设置是:

  • 应用程序负载均衡器 (ALB) 用作用户入口点。您必须使用 HTTPS 侦听器来设置身份验证。我只是将 HTTP 流量重定向到 HTTPS。
  • 每个应用程序的弹性容器服务 (ECS) 任务+服务。这确保我的应用程序得到充分配置并完全独立运行。每个应用程序都可以有一个独立的扩展策略,因此每个应用程序都有适合其流量的资源量。您甚至可以将应用程序配置为自动启动/停止以节省大量资源。显然,应用程序需要是私有的,即只能从 ALB 访问。
  • 每个 ECS 都有不同的 ALB 目标组,因此请求app1.example.com转发到app1app2.example.comapp2等。这都是在 ALB 规则中设置的。这是我们可以轻松添加身份验证的地方。

我有一个 Cognito“用户池”,用户帐户允许访问应用程序。这可用于在流量级别而不是应用程序级别限制对应用程序的访问。

为此,您首先需要在 Cognito 用户池中创建一个客户端应用程序。对于app1,我将使用具有openid范围和app1.example.com/oauth2/idpresponse作为回调 URL的“授权代码授予”流创建 Cognito 客户端应用程序。

完成此操作后,您只需进入 ALB 规则并添加身份验证作为转发的先决条件:

ALB 规则示例

从现在开始,流量app1.example.com必须经过身份验证才能转发到app1。未经身份验证的请求将被重定向到 Cognito 托管 UI(类似于example.auth.eu-west-2.amazoncognito.com)以输入其凭据。您可以在 Cognito 设置中自定义托管 UI 的外观。

有用的网址

在容器中打包 R 代码:

使用 ALB 设置 Cognito 身份验证: