Integrating Google reCAPTCHA with Shiny Applications in R
In this article, we will explore how to integrate Google reCAPTCHA with a Shiny application built using R. We will cover the process of adding the widget to your UI and retrieving its response.
Introduction to Google reCAPTCHA
Google reCAPTCHA is a challenge-response test designed to determine if the user is a human or a bot. It consists of an image with distorted text and a checkbox. The user must enter the text from the image into the box, and then check the checkbox. This process helps prevent automated scripts (bots) from accessing your site.
Installing Google reCAPTCHA in R Shiny
To use Google reCAPTCHA in our Shiny application, we will need to include the reCAPTCHA JavaScript library in our UI code. We can do this by adding a script tag to our head section and including the data-sitekey attribute with our site key.
## Install necessary libraries and packages
To install RStudio Shiny package, run:
install.packages("shiny")
## Load required libraries and packages
Load the shiny library and load UI and Server functions from it.
```R
library(shiny)
library(R6)
# Create a user interface for reCAPTCHA
ui <- function() {
# Add reCAPTCHA widget to the page
tags$head(tags$script(src = "https://www.google.com/recaptcha/api.js",
delegate = "document",
type = "inline")),
tags$div(class = "g-recaptcha", id = "google-captcha",
data_sitekey = "insert-your-site-key-here")
}
# Create a reactive expression to display the reCAPTCHA
reCAPTCHA <- reactiveValues(response = NULL)
## Define server functions for reactive expressions
server <- function(input, output) {
# Display reCAPTCHA on UI interaction
# Get response from reCAPTCHA when user clicks check box
observeEvent(input$google-captcha, {
req(reactiveValues(response = NULL))
req(reCAPTCHA())
reCAPTCHA$response <- req(reCAPTCHA)
reCAPTCHA$response <- gsub("tC", "", recaptcha_response)
# Validate response by checking if it's correct and not empty
if (nchar(reCAPTCHA$response) == 6 && grepl("\\d{2}", reCAPTCHA$response)) {
validateUser()
} else {
displayError()
}
})
# Return the response from reCAPTCHA
output$reCAPTCHA_response <- renderPrint({
print(input$google-captcha)
})
}
Explanation of Code Blocks
Here’s a breakdown of what each line does in the code snippet above:
In the UI function we use
tags$head(tags$script(src = "https://www.google.com/recaptcha/api.js"))to load reCAPTCHA library.
Add reCAPTCHA widget to the page
Use reCAPTCHA script from Google’s website
tags$head(
Load JavaScript file required for reCAPTCHA
tags$script(src = “https://www.google.com/recaptcha/api.js", delegate = “document”, type = “inline”)
Add class g-recaptcha to HTML div tag
,class = “g-recaptcha” )
- In the UI function we also use `tags$div(class = "g-recaptcha", id = "google-captcha")` to add reCAPTCHA widget on the page.
```markdown
## Display reCAPTCHA on UI interaction
# Use a div tag with class g-recaptcha and id google-captcha
tags$div(
# Class for HTML div tag
class = "g-recaptcha"
# Id of HTML div tag
,id = "google-captcha"
# Data attribute for reCAPTCHA library
,data_sitekey = "insert-your-site-key-here")
- In the Server function we use an
observeEventto listen for events triggered by theinput$google-captcha. We also define another reactive value calledreCAPTCHA.responsethat will be used to store the response from reCAPTCHA.
## Get response from reCAPTCHA when user clicks check box
# Use observeEvent to get input value of google-captcha on change
observeEvent(
# Get input value when box is checked
,input$google-captcha
# If reCAPTCHA library is loaded, proceed with response extraction
,req(reactiveValues(response = NULL))
# Call reactive expression for response extraction
,req(reCAPTCHA())
# Extract and print response from reCAPTCHA library
,reCAPTCHA()
# Assign the extracted response to a new variable called response
,response = recaptcha_response
# Remove tC at end of string
,reCAPTCHA.response <- gsub("tC", "", recaptcha_response)
- In this code snippet, we extract and print the reCAPTCHA response by using
input$google-captcha. We also validate the response to ensure that it’s correct.
## Validate response by checking if it's correct and not empty
# Check length of string
if (nchar(reCAPTCHA.response) == 6 && grepl("\\d{2}", reCAPTCHA.response)) {
# Call function for validating user
validateUser()
} else {
displayError()
}
- We also define a
renderPrintto return the response from reCAPTCHA.
## Return the response from reCAPTCHA
output$reCAPTCHA_response <- renderPrint({
# Print the value of input google-captcha
print(input$google-captcha)
})
Using reCAPTCHA Validation with R Shiny Application
Here is an example use case for integrating Google reCAPTCHA validation in a Shiny application:
## Use reCAPTCHA validation in UI
ui <- function() {
# Create reactive input box with label and placeholder
textInput("username", "Username:", "john")
# Add reCAPTCHA widget to the page
tags$head(tags$script(src = "https://www.google.com/recaptcha/api.js")),
tags$div(class = "g-recaptcha", id = "google-captcha",
data_sitekey = "insert-your-site-key-here"),
# Add submit button with label
actionButton("submit", "Submit")
}
## Define server functions for reactive expressions
server <- function(input, output) {
# Display reCAPTCHA on UI interaction
# Get response from reCAPTCHA when user clicks check box
observeEvent(input$google-captcha, {
req(reactiveValues(response = NULL))
req(reCAPTCHA())
reCAPTCHA$response <- req(reCAPTCHA)
reCAPTCHA.response <- gsub("tC", "", recaptcha_response)
# Validate response by checking if it's correct and not empty
if (nchar(reCAPTCHA.response) == 6 && grepl("\\d{2}", reCAPTCHA.response)) {
validateUser()
} else {
displayError()
}
})
# Return the response from reCAPTCHA
output$reCAPTCHA_response <- renderPrint({
print(input$google-captcha)
})
}
In this example, we use textInput to create a text input box with label and placeholder. We also add a submit button with actionButton.
## Use textInput for creating input field
# Create reactive input box with label and placeholder
textInput("username", "Username:", "john")
- In the Server function, we use an
observeEventto listen for events triggered by theinput$google-captcha. We also define another reactive value calledreCAPTCHA.responsethat will be used to store the response from reCAPTCHA.
## Get response from reCAPTCHA when user clicks check box
# Use observeEvent to get input value of google-captcha on change
observeEvent(
# Get input value when box is checked
,input$google-captcha
# If reCAPTCHA library is loaded, proceed with response extraction
,req(reactiveValues(response = NULL))
# Call reactive expression for response extraction
,req(reCAPTCHA())
# Extract and print response from reCAPTCHA library
,reCAPTCHA()
# Assign the extracted response to a new variable called response
,response = recaptcha_response
# Remove tC at end of string
,reCAPTCHA.response <- gsub("tC", "", recaptcha_response)
- In this code snippet, we extract and print the reCAPTCHA response by using
input$google-captcha. We also validate the response to ensure that it’s correct.
## Validate response by checking if it's correct and not empty
# Check length of string
if (nchar(reCAPTCHA.response) == 6 && grepl("\\d{2}", reCAPTCHA.response)) {
# Call function for validating user
validateUser()
} else {
displayError()
}
- We also define a
renderPrintto return the response from reCAPTCHA.
## Return the response from reCAPTCHA
output$reCAPTCHA_response <- renderPrint({
# Print the value of input google-captcha
print(input$google-captcha)
})
Conclusion
In this article, we have discussed how to integrate Google reCAPTCHA validation in an R Shiny application. We have covered the basic steps involved in adding reCAPTCHA validation to a Shiny app and provided example use cases.
## Use reCAPTCHA validation with your Shiny App
# Add reCAPTCHA library from google's website
tags$head(tags$script(src = "https://www.google.com/recaptcha/api.js"))
# Create HTML div tag for reCAPTCHA widget
tags$div(class = "g-recaptcha", id = "google-captcha")
# Define reactive expression to extract response from reCAPTCHA library
reactive({
recaptcha_response <- reactiveValues(response = NULL)
# Extract and print response from reCAPTCHA library
observeEvent(input$google_captcha, {
recaptcha_response$response <- gsub("tC", "", recaptcha_response$response)
if (nchar(recaptcha_response$response) == 6 && grepl("\\d{2}", recaptcha_response$response)) {
validateUser()
} else {
displayError()
}
})
# Return the response from reCAPTCHA library
{recaptcha_response$response}
})
By following these steps, you can easily integrate Google reCAPTCHA validation in your Shiny application and improve security.
Last modified on 2025-03-11