我想为我的闪亮应用程序提供基本身份验证,理想情况下我并不想处理登录协议或密码管理。我希望我的应用程序提供数据的公共视图,但如果用户通过身份验证,则可以使用个性化数据集。在最好的情况下,我想使用联合登录,例如Google。
一种解决方案是使用代理(auth0,shinyProxy)。这是一个重量级的解决方案,需要运行其他服务。此外,没有简单的方法来与闪亮的服务器通信用户登录,这是我的主要目标。并且代理不允许应用程序以非身份验证模式运行,这是我需要的。
另一个解决方案是使用javascript手工制作一个相对简单的用户名/密码界面。这是an example。但我不想手动管理用户名/密码验证。在我的应用程序中,我想允许任何人使用该应用程序,但我只需为每个用户提供一个唯一的ID以获得个性化体验。
因此,如果我想使用Google的身份验证,那么第三种方法是使用GoogleAuthR。但是我发现该库存在问题,因为我无法通过它来支持持久登录。与使用联合登录的其他应用程序一样,我希望用户稍后返回该URL并仍然连接。
答案 0 :(得分:3)
我的解决方案是使用Google Sign-In API,编写极少量的javascript,并使用js函数Shiny.onInputChange
从用户数据创建反应变量。
登录API提供了一个按钮,不需要保密,并且允许在HTML HEAD中的元标记中指定客户端ID和范围,因此它非常易于使用。
在app.R
我只需添加Google API代码,范围,客户ID和此类登录按钮。
ui <- tagList(
tags$head(
tags$meta(name="google-signin-scope",content="profile email"),
tags$meta(name="google-signin-client_id", content="YOURCLIENTID.apps.googleusercontent.com"),
HTML('<script src="https://apis.google.com/js/platform.js?onload=init"></script>'),
includeScript("signin.js"),
),
fluidPage(
titlePanel("Sample Google Sign-In"),
sidebarLayout(
sidebarPanel(
div(id="signin", class="g-signin2", "data-onsuccess"="onSignIn"),
actionButton("signout", "Sign Out", onclick="signOut();", class="btn-danger")
请注意,Google的API会将signin
div转换为按钮,而data-onsuccess参数会将函数onSignIn
命名为成功进行身份验证时调用。方便地,无论用户是自动登录还是实际通过Google审批流程,都会调用此方法。
还有一个signOut函数可以使本地cookie无效,并使配置文件数据无效。
在单独的文件signin.js
中,我定义了回调函数onSignIn
,它将用户个人资料信息从客户端发送到闪亮的服务器。
function onSignIn(googleUser) {
var profile = googleUser.getBasicProfile();
Shiny.onInputChange("g.id", profile.getId());
Shiny.onInputChange("g.name", profile.getName());
Shiny.onInputChange("g.image", profile.getImageUrl());
Shiny.onInputChange("g.email", profile.getEmail());
}
function signOut() {
var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut();
Shiny.onInputChange("g.id", null);
Shiny.onInputChange("g.name", null);
Shiny.onInputChange("g.image", null);
Shiny.onInputChange("g.email", null);
}
就是这样。您的UI和服务器只需添加代码即可访问用户配置文件被动响应。以下是UI中的示例:
mainPanel(
with(tags, dl(dt("Name"), dd(textOutput("g.name")),
dt("Email"), dd(textOutput("g.email")),
dt("Image"), dd(uiOutput("g.image")) ))
)
在服务器中:
server <- function(input, output) {
output$g.name = renderText({ input$g.name })
output$g.email = renderText({ input$g.email })
output$g.image = renderUI({ img(src=input$g.image) })
我把你可以运行的a working example放在一起(有一点点扭曲 - 你必须指定端口7445并使用localhost)。请阅读自述文件了解更多详情。
答案 1 :(得分:1)
对我来说,GoogleAuthR
软件包实际上非常有效。我使用了googleAuth
(服务器)和googleAuthUI
(ui)函数的组合。有关更多选项,请参阅以下更新的文章:
Google authentication types for R
这将帮助您获取令牌,您可以使用gargle
库中的函数从中提取用户信息:
例如,您还可以将此令牌用于其他与Google相关的功能,例如访问Google云端硬盘(使用googledrive
库或编辑Google表格(使用googlesheets4
库)。