-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
f22f875
commit 2df69a4
Showing
4 changed files
with
60 additions
and
30 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,55 +1,84 @@ | ||
# tapLock | ||
# tapLock <img src="man/figures/tapLock.png" align="right" width=120 height=139 alt="" /> | ||
|
||
## Example Shiny App with Entra ID Authentication | ||
Secure your R applications with OpenID Connect and OAuth 2.0. | ||
|
||
```R | ||
library(shiny) | ||
library(tapLock) | ||
## Summary | ||
|
||
tapLock is an R library that provides a simple interface to | ||
integrate OpenID Connect / OAuth 2.0 authentication into you Shiny | ||
applications and Plumber APIs. tapLock uses a unique approach to | ||
effectively secure your applications without the need to write almost | ||
any code. | ||
|
||
## Authentication providers | ||
|
||
tapLock supports the following authentication providers: | ||
|
||
- [Google](https://developers.google.com/identity/protocols/oauth2/openid-connect) | ||
- [Microsoft Entra ID](https://www.microsoft.com/en-us/security/business/identity-access/microsoft-entra-id) | ||
|
||
> If you need support for other providers, please contact us at | ||
> [[email protected]](mailto:[email protected]). Or, if you are a | ||
> developer, you can contribute to the project by adding support for | ||
> additional providers. | ||
## Security Model | ||
|
||
tapLock is unique in its approach to securing Shiny applications and | ||
Plumber APIs. tapLock utilizes middlewares that intercept all incoming | ||
requests (both HTTP and WebSocket requests) and validates the | ||
authentication token. This approach allows tapLock to be lean and | ||
efficient since no expensive WebSocket connections are started until | ||
the user is authenticated. It also prevents sensitive data in the UI | ||
portion of the application from being exposed to unauthenticated users. | ||
|
||
## How to use tapLock with Shiny | ||
|
||
#### 1. Install tapLock | ||
|
||
``` r | ||
pak::pak("ixpantia/taplock") | ||
``` | ||
|
||
#### 2. Create an authentication configuration | ||
|
||
``` r | ||
library(taplock) | ||
|
||
auth_config <- new_openid_config( | ||
provider = "entra_id", | ||
# The following values are obtained from the authentication provider | ||
tenant_id = Sys.getenv("TENANT_ID"), | ||
client_id = Sys.getenv("CLIENT_ID"), | ||
client_secret = Sys.getenv("CLIENT_SECRET"), | ||
# This should be the URL of your application | ||
app_url = Sys.getenv("APP_URL") | ||
) | ||
``` | ||
|
||
ui <- fluidPage( | ||
tags$h1("tapLock example"), | ||
textOutput("user") | ||
) | ||
|
||
server <- function(input, output, session) { | ||
#### 3. Secure your Shiny application | ||
|
||
output$user <- renderText({ | ||
given_name <- get_token_field(token(), "given_name") | ||
family_name <- get_token_field(token(), "family_name") | ||
expires_at <- expires_at(token()) | ||
glue::glue( | ||
"Hello {given_name} {family_name}!", | ||
"Your authenticated session will expire at {expires_at}.", | ||
.sep = " " | ||
) | ||
}) | ||
|
||
} | ||
``` | ||
To secure your Shiny Application you will simply need to expose | ||
an `sso_shiny_app` instead of a regular `shinyApp` at the end of your | ||
`app.R` file. | ||
|
||
## Example Shiny App with Google Authentication | ||
Here is an example of a Shiny application that uses tapLock to secure | ||
itself: | ||
|
||
```R | ||
``` r | ||
library(shiny) | ||
library(tapLock) | ||
|
||
auth_config <- new_openid_config( | ||
provider = "google", | ||
provider = "entra_id", | ||
tenant_id = Sys.getenv("TENANT_ID"), | ||
client_id = Sys.getenv("CLIENT_ID"), | ||
client_secret = Sys.getenv("CLIENT_SECRET"), | ||
app_url = Sys.getenv("APP_URL") | ||
) | ||
|
||
ui <- fluidPage( | ||
tags$h1("tapLock example"), | ||
tags$h1("r.sso example"), | ||
textOutput("user") | ||
) | ||
|
||
|
@@ -67,5 +96,6 @@ server <- function(input, output, session) { | |
}) | ||
|
||
} | ||
``` | ||
|
||
sso_shiny_app(auth_config, ui, server) | ||
``` |
File renamed without changes
File renamed without changes