روش استفاده از ویژگی Turnstile کلودفلر برای پیادهسازی کپچا در برنامههای ASP.NET Core
نویسنده: وحید نصیری
تاریخ: ۱۴۰۳/۱۲/۲۹ ۰۹:۴۳
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=onloadTurnstileCallback" async defer></script>
<form ...> <div id="turnstile-container"></div> </form>
const captchaSolved = ref(false);
window.onloadTurnstileCallback = function () {
turnstile.render("#turnstile-container", {
sitekey: "SITE_KEY",
callback: function (token) {
captchaSolved.value = true;
},
'expired-callback': function () {
captchaSolved.value = false;
}
});
};onloadTurnstileCallback توسط اسکریپت Turnstile فراخوانی میشود تا ویجت را بارگذاری کند. وقتی کاربر، چالش را با موفقیت حل کند، تابع callback فراخوانی میشود. به یاد داشته باشید که SITE_KEY را با کلید سایت Turnstile که در مرحله قبل کپی کردید، جایگزین کنید.onSubmit آورده شده است:const onSubmit = handleSubmit(() => {
const token = turnstile.getResponse();
if (token === "" || token == undefined || token == null) {
return;
}
captchaSolved.value = false;
axios
.post('/myendpoint', Qs.stringify({ captcha: token }))
.then(response => {
turnstile.reset("#turnstile-container");
captchaSolved.value = false;
// Success
})
.catch(error => {
turnstile.reset("#turnstile-container");
captchaSolved.value = false;
// Failure
});
});/myendpoint را در ASP.NET Core پیادهسازی کنیم:public class MyController(Captcha captcha) : ControllerBase
{
[HttpPost]
[Route("myendpoint")]
public async Task<ActionResult> MyEndpoint(string token)
{
if (!await captcha.IsValid(token)) return BadRequest();
// Business logic goes here
return Ok();
}
}token دریافت میکند و این توکن برای اعتبارسنجی (validation) به یک کلاس به نام Captcha ارسال میشود.Captcha را به عنوان یک کلاینت HTTP ساده پیادهسازی میکنیم. اگرچه پکیجهای NuGet متعددی برای این کار وجود دارند، اما پیادهسازی دستی آن بسیار ساده است:public class Captcha(HttpClient captchaClient)
{
public async Task<bool> IsValid(string token)
{
try
{
var formData = new Dictionary<string, string>
{
{ "secret", "SITE_SECRET" },
{ "response", token }
};
var content = new FormUrlEncodedContent(formData);
var postTask = await captchaClient.PostAsync("/turnstile/v0/siteverify", content);
var result = await postTask.Content.ReadAsStringAsync();
var resultObject = JsonSerializer.Deserialize<JsonElement>(result);
return resultObject.GetProperty("success").GetBoolean();
}
catch
{
return false;
}
}
}Captcha اعتبارسنجی توکن را با استفاده از HttpClient ارائه شده در سازنده (constructor) پیادهسازی میکند. متد IsValid یک درخواست HTTP POST به endpoint /turnstile/v0/siteverify با کلید مخفی Turnstile و توکن تولید شده ارسال میکند. API Cloudflare یک مقدار بولی (boolean) را برمیگرداند که نشاندهنده معتبر بودن یا نبودن توکن است. به یاد داشته باشید که SITE_SECRET را با کلید مخفی Turnstile که در مرحله قبل کپی کردید، جایگزین کنید.Captcha برای تزریق وابستگی (dependency injection) در Program.cs است:builder.Services.AddHttpClient<Captcha>(x =>
{
x.BaseAddress = new Uri("https://challenges.cloudflare.com");
});Captcha را با یک HttpClient ارائه شده اضافه میکند که با API Cloudflare ارتباط برقرار میکند.