dk.*_*dk. 2 r google-api google-oauth shiny
我想为闪亮的应用程序提供基本身份验证,理想情况下,我不想处理登录协议或密码管理。我希望我的应用提供公开的数据视图,但是如果用户进行了身份验证,则可以使用个性化数据集。在最好的情况下,我想使用联合登录(例如Google)。
一种解决方案是使用代理(auth0,shinyProxy)。这是一个重量级的解决方案,需要运行其他服务。另外,没有简单的方法可以将用户登录信息与闪亮的服务器进行通信,这是我的主要目标。并且代理不允许该应用在我要求的非身份验证模式下运行。
另一种解决方案是使用javascript手工制作相对简单的用户名/密码界面。这是一个例子。但是我宁愿不手动管理用户名/密码验证。在我的应用程序中,我希望任何人都可以使用该应用程序,但是我只需要为每个用户提供唯一的ID,即可获得个性化的体验。
因此,如果我想使用Google的身份验证,那么第三种方法是使用GoogleAuthR。但是我发现该库存在问题,因为我无法使其支持持久登录。像其他使用联合登录的应用程序一样,我希望用户稍后返回该URL并仍然保持连接状态。
我的解决方案是使用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)。请阅读自述文件以了解更多详细信息。
| 归档时间: |
|
| 查看次数: |
960 次 |
| 最近记录: |