2018年6月14日 星期四

如何加入google recaptcha圖型驗證



因為自動爬文的功能日益強大,所以要讓我們的網頁不會被機器人攻佔,我們就要作最基本驗證,你是不是機器人的驗證,google recaptch 就是最簡單好用的工具,以下就是基本範例。


一、上網註冊帳號

驗證的domain: 是你目前網站的domain


註冊成功後
取得一組密碼,分別是Site key Secret key site key是用前端網頁用,secret key 允許後端驗證


二、引用recaptcha.js
<script src='https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit'></script>

<div id="captcha_container" class="google-cpatcha" ></div>
<div id="captcha_container_response"></div> <!--視情況是否需要->

三、如何取得前端的驗證碼

Google recaptcha 會先取得Site Key 進行到驗證後,取得一連串的回傳碼,那一串的回傳碼,如果這回傳碼要post server端,就需要先儲存下來,所以下面的就是將callback呼叫onSubmit的函式,將回傳值結果儲存在div

var onloadCallback = function () {
            var sitekey = "6LcHul0XXXXXXXXXXXXXM6NNUXf";
            grecaptcha.render('captcha_container', {
                'sitekey': sitekey,
                'callback': onSubmit
      });
};

//以下是作者後端需要驗證,所以會保留回傳值,一般的情況是可省略
function onSubmit(response) {
         $("#captcha_container_response").val(response);
}

//以下是筆者先呼叫後端前,先驗證是否機器人,成功後才呼叫後端
$scope.SendChangePassword = function () {
        var v = grecaptcha.getResponse();
        var vertification = false;
        if (v.length == 0) {
           alert("驗證失敗!");
            return;
        }
//筆者以非同步呼叫後端,所以連後端也需要驗證
$scope.grecaptchaResponse=$("#captcha_container_response").val();
$http({
       method: 'POST',
       data: {
           oldPassword: $scope.txtOldPassword,
           newPassword: $scope.txtNewPassword,
           newRePassword: $scope.txtReNewPassword,
            grecaptchaResponse: $scope.txtReNewPassword
        },
           url: '/Web/Changepassword/SendChanegPassword',
           cache: false
       })

}


四、如何取得後端的驗證碼


[HttpPost]
        public ActionResult SendChanegPassword(string oldPassword, string newPassword,
  string newRePassword,string grecaptchaResponse)
        {
            var googleRecaptchResponse = grecaptchaResponse;
            GoogleRecaptchService googleRecaptchSvc = new GoogleRecaptchService();
            bool vertificationSucess = googleRecaptchSvc.Verification(grecaptchaResponse);
            if (vertificationSucess == false)
                return Json(new { success = false, message = "後端驗證失敗!" });

            PageResult result = new PageResult();
            BusinessLogic bi = new BusinessLogic();

            try
            {
                result = bi.ChangePassword(oldPassword, newPassword);
            }
            catch (Exception ex)
            {
                result.isSuccess = false;
                result.alertMessage = ex.Message;
                return Json(new { success = false, message = ex.Message });
            }

            return Json(new { success = true, message = result });

        }

    public class GoogleRecaptchService
    {
        public bool Verification(string recaptchResponse)
        {
            try
            {
                var client = new WebClient();

                                                          // 透過GoogleAPI 來驗證回傳碼是正確的,
您需要輸入回傳碼和secret key,它會回傳是否驗證成功的訊息

                var result = client.DownloadString(string.Format("https://www.google.com/recaptcha/api/siteverify?secret={0}&response={1}"" 輸入Secret key ", recaptchResponse));
                var obj = JObject.Parse(result);
                bool status = (bool)obj.SelectToken("success");
                return status;
            }
            catch (Exception ex)
            {
                throw;
            }
        }

    }


PS: 如果表單是用submit 送到後端時,只需要   string Response = Request["g-recaptcha-response"],就會自動取得回傳的驗證碼囉~

五、結果

 頁面下方多了一個我不是機器人圖示

















勾選後,就會自動產生回傳碼(儲存頁面中),驗證成功後,才呼叫後端



















如果頁面放置太久,原本驗證成功的訊息,也會時間太久而失效,需要再點選驗證喔
















以上是筆者簡單的介紹喔!!!  是不是很好用…  








2018年2月6日 星期二

Ionic3 + FCM (推播)

Firebase 推出FCM 目的將用來取代GCM,雖然GCM 仍然不滅,但我們先來嘗鮮看看,連推播的介面都已經設計好了,只要簡單幾行Code就可以完成推播的功能,廢話不說,就先看示範吧。

一、   下戴必要的套件


二、   設定Config.XML

修改widget id的名稱,因為要對應到FCM準備要推播的應用程式名稱,所以如果不一致就無法接收推播了喔!!!  很重要

三、注入model

import { FCM } from '@ionic-native/fcm';
@NgModule({
  declarations: [
    MyApp,
    AboutPage,
    ContactPage,
    HomePage,
    TabsPage
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp)
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    AboutPage,
    ContactPage,
    HomePage,
    TabsPage
  ],
  providers: [
    StatusBar,
    SplashScreen,
    {provide: ErrorHandler, useClass: IonicErrorHandler},
    FCM
  ]
})
export class AppModule {}
FCM 推播的物件是要被注入Provider ,如果沒注入 就會失敗囉~

四、呼叫FCM 的實作演練
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { FCM } from '@ionic-native/fcm';   //注入FCM Constructor
@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {

  constructor(public navCtrl: NavController, private fcm: FCM) {
  
  fcm.subscribeToTopic('marketing');
 
//取得FCM token
  fcm.getToken().then(token => {
    alert("getToken")
  })

 //取得FCM 的推播訊息
   fcm.onNotification().subscribe(data => {
    if (data.wasTapped) { //取得背景監聽
      alert("message in background!");
    } else {
      alert("message in front! "); //前景
      alert(JSON.stringify(data)); //取得推播資訊
    };
  })

  //取消推播
  fcm.unsubscribeFromTopic('marketing');

  }

}

根據Ionic的官方文件 需要訂閱名稱,位置放在constructor fcm.subscribeToTopic('marketing');

在結束時就要將訂閱名稱取消
fcm.unsubscribeFromTopic('marketing');

五、設定推播內容

Project OverView à 新增其他應用程式 (config.xml的 widget id)



















點選新增訊息



選擇剛剛新增 應用程式











設定前景資料(當應用程式是開啟)

接收的推播