asp.net web api recaptcha v3

花了一陣子又搞不太起來,結果反而錯誤是出在 asp.net web api 一直無法接收到參數身上。

關於這個雷我已經踩很多次了,但每次趕時間就又忘了紀錄,當 web api 接收 1 個參數時要加上 [FromBody],前端的jquery 呼叫 ajax 時參數必須寫成 data: JSON.stringify(token), 而 contentType: “application/json” 這樣才可以正確的讓 web api 接收到參數。

參考連結

https://chengjhe.blogspot.com/2018/11/how-to-use-recaptcha-v3.html

https://dotblogs.com.tw/mantou1201/2013/05/29/105059

後端 code

[HttpPost]
public IHttpActionResult VerifyBot([FromBody]string token)
{
	using (var client = new HttpClient())
	{
		client.DefaultRequestHeaders.Accept.Clear();
		client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
		string url = string.Format(
			"https://www.google.com/recaptcha/api/siteverify?secret={0}&response={1}",
			"你的後端金鑰",
			token);
		HttpResponseMessage response = client.GetAsync(url).Result;

		string result = response.Content.ReadAsStringAsync().Result;

		if (response.IsSuccessStatusCode)
		{
			var reCAPTCHA = JsonConvert.DeserializeObject<ReCAPTCHA>(result);

			if (reCAPTCHA.score > 0.5)
			{
				return Ok(reCAPTCHA);
			}
		}

		return Ok("Verify Bot Fail");
	}
	
}

新增類別

public class ReCAPTCHA
    {
        public bool success { get; set; }
        public double score { get; set; }
        public string action { get; set; }
        public DateTime challenge_ts { get; set; }
        public string hostname { get; set; }
    }

前端 code

grecaptcha.ready(function () {

	//對 google發送取得 token
	grecaptcha.execute('前端金鑰', {
		action: '/api/VerifyBot'
	}).then((token) => {
		//跟自己的 server 後端組合 token
		$.ajax({
			type: 'POST',
			url: '/api/VerifyBot',
			data: JSON.stringify(token),
			contentType: "application/json",
			success: (res) => {
				console.log('res:');
				console.log(res);
			}
		});
	});
});

 

 


發佈留言