درود خدمت دوستان . امروز برای پیاده سازی فرم به سمت پیاده سازی reCAPTCHA رفتم اولش تصمیم گرفتم یک کتابخانه نصب کنم که دیدم خیلی ارور داره بعد تو پیوستگی های پلاگین دیدم که از HTTPoison استفاده می کنه به همین ترتیب یک کد ساده بدون کتابخانه آماده کردم ام. به شرح زیر
اول به لینک زیر برید
https://www.google.com/recaptcha/admin
بعد از وارد شدن اطلاعات دامنه رو بدید و دو کلید خصوصی و عمومی را دریافت کنید
در مرحله بعدی کد زیر را وارد قالب خودتان بکنید
<script src='https://www.google.com/recaptcha/api.js'></script>
در توضیحات گوگل اومده که:
Paste this snippet before the closing </head> tag on your HTML template:
حالا کد زیر رو در نمونه فرم خودتان قرار بدهید
<div class="g-recaptcha" data-sitekey="Site key"></div>
جایی که نوشته Site key همون کلید عمومی شما هست که در سایت گوگل بهتون داده است
نکته: نمایش و عدم نمایش چک کننده گوگل بر اساس داکیومنتش به چندین دسته تقسیم می شه که می تونید در لینک زیر بخونید(در منبع همین پست قرار دادم)
نمونه کدی که در قالب قرار دادم(فرم)
<div class="col-12 login-form rtl">
<%= form_for @conn, user_path(@conn, :login_register_sender), fn f -> %>
<div class="form-group">
<label for="email">ایمیل</label>
<%= email_input f, :email, class: "form-control", id: "login-email", autocomplete: "email", aria_describedby: "emailHelp", required: "" %>
<small id="emailHelp" class="form-text text-muted">ایمیل شما با هیچ فرد و گروهی به اشتراک گذاشته نخواهد شد.</small>
</div>
<div class="form-group">
<label for="password">پسورد</label>
<%= password_input f, :password, class: "form-control", id: "passinput", autocomplete: "password", required: "" %>
</div>
<div class="recap">
<div class="g-recaptcha" data-sitekey="6LfuiG8UAAAAAKo_a8krLO037O9imNIOT3fWLc6G"></div>
</div>
<%= submit "ارسال", class: "btn btn-primary" %>
<% end %>
</div>
حالا زمان این هست که ریسپانسی که به واسطه کد مذکور با کلید عمومی شما درست می شه رو با کلید خصوصی خودتون به گوگل بفرستید با یک درخواست post توجه کنید این درخواست نباید json باشه
به عنوان مثال من اینجوری بررسی کردمش
def login_register_sender(conn, %{"name" => _name, "lastname" => _lastname, "email" => _email, "password" => _password} = info_of_register) do
ip_os = TrangellHtmlSite.ip_os(conn)
info_map = User.register_mapper(info_of_register)
with {:ok, %HTTPoison.Response{status_code: 200, body: body_of_token}} <- TrangellHtmlSite.User.google_recap(info_of_register["g-recaptcha-response"]),
%{"challenge_ts" => _time, "hostname" => _host, "success" => true} <- Jason.decode!(body_of_token),
{:ok, %HTTPoison.Response{status_code: 200, body: _user_info}} <- User.register_sender(info_map, ip_os.ip, ip_os.os) do
اگر توجه کنید همراه params یا ورودی هایی که به تابع شما ارسال می شه به صورت زیر می تونید دریافتش کنید
info_of_register["g-recaptcha-response"]
و حالا کافیه اون رو به گوگل بفرستید . چیزایی که گوگل در خواست از شما می خواهد
کد های ارسالم
def google_recap(response) do
TrangellHtmlSite.google_post_recap("https://www.google.com/recaptcha/api/siteverify", %{"secret" => "SECRET_COD", "response" => response})
end
و خود ارسال کننده درخواست
def google_post_recap(root_link, params) do
body = "secret=#{params["secret"]}&response=#{params["response"]}"
HTTPoison.post(
"#{root_link}",
body,
[
{"Content-Type", "application/x-www-form-urlencoded"},
{"Accept", "text/html"}
],
[timeout: 50_000, recv_timeout: 50_000]
)
end
توجه: اینجا کلید خصوصی به صورت هارد کد قرار گرفته شما باید اون رو در سیستم عاملتون ذخیره کنید و به وسیله الکسیر از متغییر سیستمیتون بخونید.
امید وارم مفید واقع بشه
توجه کلید خصوصی قرار گرفته در تصاویر کلید خصوصی تست بوده و حذف گردیده
منابع:
نمونه کد پست