如何在闪亮的R应用程序中实现Google身份验证?

时间:2018-05-15 03:50:43

标签: r google-api shiny google-oauth

我想为我的闪亮应用程序提供基本身份验证,理想情况下我并不想处理登录协议或密码管理。我希望我的应用程序提供数据的公共视图,但如果用户通过身份验证,则可以使用个性化数据集。在最好的情况下,我想使用联合登录,例如Google。

一种解决方案是使用代理(auth0shinyProxy)。这是一个重量级的解决方案,需要运行其他服务。此外,没有简单的方法来与闪亮的服务器通信用户登录,这是我的主要目标。并且代理不允许应用程序以非身份验证模式运行,这是我需要的。

另一个解决方案是使用javascript手工制作一个相对简单的用户名/密码界面。这是an example。但我不想手动管理用户名/密码验证。在我的应用程序中,我想允许任何人使用该应用程序,但我只需为每个用户提供一个唯一的ID以获得个性化体验。

因此,如果我想使用Google的身份验证,那么第三种方法是使用GoogleAuthR。但是我发现该库存在问题,因为我无法通过它来支持持久登录。与使用联合登录的其他应用程序一样,我希望用户稍后返回该URL并仍然连接。

2 个答案:

答案 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库中的函数从中提取用户信息:

Get info from a token

例如,您还可以将此令牌用于其他与Google相关的功能,例如访问Google云端硬盘(使用googledrive库或编辑Google表格(使用googlesheets4库)。