Hash :
1f16488e
Author :
Thomas de Grivel
Date :
2021-11-29T07:27:06
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
defmodule PlugRecaptcha2 do
import Plug.Conn
def init(default), do: default
def call(conn, [recaptcha_secret: secret,
redirect: redirect]) do
case conn do
%Plug.Conn{params: %{"recaptcha" => signature}} ->
case verify_signature(signature, secret) do
{:ok} -> conn
_ -> halt_connection(conn, redirect)
end
_ ->
# IO.puts "no recaptcha param"
halt_connection(conn, redirect)
end
end
def call(conn, [recaptcha_secret: secret]) do
call(conn, [recaptcha_secret: secret,
redirect: nil])
end
def call(_conn, _opts), do: raise "Recaptcha Secret is missing"
defp verify_signature(signature, secret) do
post_url = "https://www.google.com/recaptcha/api/siteverify?secret=#{secret}&response=#{signature}"
resp = HTTPoison.post(post_url, "", [{"Content-Type", "application/json"}])
IO.inspect(recaptcha: resp)
case resp do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
Poison.decode(body)
|> verify_response
_ -> {:fail}
end
end
defp verify_response({:ok, %{"success" => true}}), do: {:ok}
defp verify_response(_), do: {:fail}
defp halt_connection(conn, redirect) do
url = hd(get_req_header(conn, "referer")) || redirect || "/"
conn
|> Phoenix.Controller.redirect(external: url)
end
end