Getting Started | API | Elements | Actions | Validators | Handlers | Configuration Options | Advanced Guides | Troubleshooting | About
The recaptcha element produces a recaptcha element. For more information about recaptchas you may refer to https://developers.google.com/recaptcha/
The element is rendered and evaluated by an external library.
The captcha is processed as follows:
Page:recaptcha_event is called with a Result of error.Page:recaptcha_event callback is called with a Result of ok.Page:recaptcha_event callback is evaluated as follows:ok nothing is done.error, the captcha gets refreshed.{error, Msg}, the captcha gets refreshed and the Msg is shown as the error message.Before you can use the the recaptcha element, you have to register at https://www.google.com/recaptcha/admin/create.
After that, you have to either specify the following values in your app.config or specify them as attributes to the #recaptcha{} element itself.
[
{nitrogen, [
{recaptcha,
[{public_key, "recaptcha_public_key"},
{private_key, "recaptcha_private_key"},
{challenge_url, "http://www.google.com/recaptcha/api/challenge"},
{verify_url, "http://www.google.com/recaptcha/api/verify"}]}
...
]},
...
]. #recaptcha {
public_key="some_public_key",
private_key="some_private_key"
}The following attributes are required unless they are defined as nitrogen environment variables above.
public_key (string) - Public key provided by the Recaptcha service.private_key (string) - Private key provided by the Recaptcha service.tag (term) - The "tag" for the recaptcha element to be passed to the recaptcha_event/2 functionbutton_id (atom) - The button's idbutton_label (string) - The button's labelbutton_class (string, atom, or list of atoms) - The button's HTML class.captcha_opts (proplist) - The captcha's options. For more information see the official Recaptcha Documentation custom_theme_widget is not supportedchallenge_url (string) - The challenge URL as specified in the Recaptcha Documentation (default: https://www.google.com/recaptcha/api/challenge")verify_url (string) - The verification URL as specified in the Recaptcha Documentation (default: https://www.google.com/recaptcha/api/verify")When a recaptcha succeeds or fails, the recaptcha_event/2 function is called on your page module. Tag will be from the tag attribute above, and Result will be a status atom, either ok if successful, or {error, ErrorMessage} if the recaptcha fails.
recaptcha_event/2 can return any of the following:
ok - Everything is okay.error - There was something that failed (maybe you did some data validation in the event_recaptcha/2 function and something failed so let's just return an error.{error, ErrorMessage} - Something went wrong, and let's set the error message to the contents of ErrorMessage (which, like fail_body above, can be either text or Nitrogen elements).recaptcha_event(_Tag, ok) ->
wf:wire(#alert{text="Congrats, you're human"}),
ok;
recaptcha_event(_Tag, {error, ErrorReason}) ->
wf:wire(#alert{text="WE THINK YOU'RE A ROBOT! YOU MUST PROVE OTHERWISE!"}),
{error, "Please Try again!"}.If you wish to trigger validators before the Recaptcha gets used, you'll need to wire the validators to the Recaptcha's button_id attribute.
You can see this in use in the example below:
Code in a page module may look like this:
inner_body() ->
%% Wire a validator to be triggered by `recaptcha_button`, and target `name`
wf:wire(recaptcha_button, name, #validate{ validators=[
#is_required{}
]}),
[
#label{text="Enter your name"},
#textbox{id=name},
#recaptcha{
button_id=recaptcha_button,
id=recaptcha,
tag=my_recaptcha,
captcha_opts=[{theme,white}]
}
].
event_recaptcha(my_recaptcha, ok) ->
case check_user_input() of
ok -> wf:remove(recaptcha),
ok;
error -> {error, "FAIL!"}
end.
check_user_input() ->
%% your check routine
Released under the MIT License.