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

dk.*_*dk. 2 r google-api google-oauth shiny

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

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

另一种解决方案是使用javascript手工制作相对简单的用户名/密码界面。这是一个例子。但是我宁愿不手动管理用户名/密码验证。在我的应用程序中,我希望任何人都可以使用该应用程序,但是我只需要为每个用户提供唯一的ID,即可获得个性化的体验。

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

dk.*_*dk. 6

我的解决方案是使用Google Sign-In API,编写少量的javascript,然后使用js函数Shiny.onInputChange从用户数据创建反应性变量。

登录API提供了一个按钮,不需要任何秘密,并且允许在HTML HEAD的meta标签中指定客户端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")
Run Code Online (Sandbox Code Playgroud)

请注意,Google的API将把signindiv变成一个按钮,而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);
}
Run Code Online (Sandbox Code Playgroud)

就是这样 您的UI和服务器只需要添加代码即可访问用户配置文件反应。这是UI中的示例:

 mainPanel(
        with(tags, dl(dt("Name"), dd(textOutput("g.name")),
                      dt("Email"), dd(textOutput("g.email")),
                      dt("Image"), dd(uiOutput("g.image")) ))
      )
Run Code Online (Sandbox Code Playgroud)

在服务器中:

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) })
Run Code Online (Sandbox Code Playgroud)

我整理了一个可以运行的示例(只需很小的扭曲-您必须指定端口7445并使用localhost)。请阅读自述文件以了解更多详细信息。

  • 由于这个问题,Google SignIn 模块现在可以在 googleAuthR https://code.markedmondson.me/googleAuthR/articles/google-authentication-types.html#googlesignin-module-example 中使用 (2认同)