Ch10-5 : ReAuth

[ReAuth]
重發認證信,基本上是為了使用者註冊成為會員之後,忘記點選認證信,過了認證時間所設計,流程混用了註冊與驗證認證信部份功能,而這邊會調整成符合重發認證信的流程。

  • Step 1 : 檢查輸入的資料是否符合需要的格式
  • Step 2 : 檢查輸入的信箱與使用名稱,是否有該會員資料
  • Step 3 : 會員資料,檢查是否已認證
  • Step 4 : 尚未認證,再次補寄送認證信

Step 0
回到WebController,重發認證信程式會是這個流程,下面的Step會依序講解認證步驟。
path : /app/controllers/WebController.java

  public Result goToResendAuthEmail(){

    // 清除暫存錯誤訊息
    flash().clear();

    SignupRequest request = this.getSignupRequest();
    if(request==null){
      flash().put("error", "輸入資料錯誤,請重新嘗試!!");
      return ok(resendAuthEmail.render());
    }

    // Step 2
    Member member = null;
    String email = request.getEmail();
    String username = request.getUsername();
    try{
      member = webService.findMemberByEmailAndUserName(email, username);
    } catch(Exception e){
      e.printStackTrace();
      flash().put("error", "系統忙碌中,請稍候再嘗試,謝謝。");
      return ok(resendAuthEmail.render());
    }

    // Step 2 
    if(member == null){
      flash().put("error", "查無註冊資料,請確認資料是否填寫正確,謝謝。");
      return ok(resendAuthEmail.render());
    }

    // Step 3
    if(!MemberStatus.S1.getStatus().equals(member.getStatus())){
      flash().put("error", "您的帳號,已經認證成功,不需再重新認證,謝謝。");
      play.Logger.warn("member      = " + Json.toJson(member));
      return ok(resendAuthEmail.render());
    }

    // Step 4
    try{
      String signupAuthString = new Utils_Signup().genSignupAuthString(member.getEmail());
      Map<String , String> memberToken = new HashMap<String , String>();
      memberToken.put("memberNo", member.getMemberNo());
      memberToken.put("tokenString", signupAuthString);
      memberToken.put("type", MemberTokenType.Signup.toString());
      int isSignupAuthStringOk = webService.genSignupAuthData(memberToken);

      Utils_Email utils_Email = new Utils_Email();
      Email authMail = utils_Email.genSinupAuthEmail(member, signupAuthString);
      boolean isSeadMailOk = utils_Email.sendMail(authMail);

      play.Logger.info("isSignupAuthStringOk = " + isSignupAuthStringOk +" , isSeadMailOk = " + isSeadMailOk);
    } catch(Exception e){
      e.printStackTrace();
    }
    flash().put("ok", "已重發認證信,請至註冊信箱收取認證信,謝謝。");
    return ok(resendAuthEmail.render());
  }


對應的網址。
path : conf/routes

# http://127.0.0.1:9000/web/resendAuthEmail
GET        /web/resendAuthEmail    controllers.WebController.resendAuthEmail()

# http://127.0.0.1:9000/web/resendAuthEmail
POST    /web/resendAuthEmail    controllers.WebController.goToResendAuthEmail()


對應的HTML
path : app/views/web/loginSignup/resendAuthEmail.scala.html

<!DOCTYPE html>
<html >
  <head>
    <meta charset="UTF-8">
    <title>重發認證信</title>

    @views.html.web.headerLibs()

    @views.html.web.loginSignup.loginSignupLibs()

  </head>

  <body>

    <div id="page-wrapper">
        <div id="select_nav_signup">@views.html.web.headerNav()</div>
    </div>
    <div class="form">

      <ul class="tab-group">
        <li class="tab active"><a href="#signup">重發認證信</a></li>
      </ul>

      <div class="tab-content"> 
        <div id="signup">   
            <form action="@controllers.routes.WebController.goToResendAuthEmail.url" method="post" id="reSendAuthForm">
            <div class="field-wrap">
                <label class="lable-field-wrap">使用者名稱</label>
                <input type="text" required autocomplete="off" name="username"/>
            </div>
            <div class="field-wrap">
                <label class="lable-field-wrap">電子信箱</label>
                <input type="email" required autocomplete="off" name="email"/>
                @if(flash.containsKey("error")) {
                    <span style="color:red;">@flash.get("error")</span>
                }
                @if(flash.containsKey("ok")) {
                    <span style="color:green;">@flash.get("ok")</span>
                }
            </div>
            <a>
                <input type="submit" value="Resend" class="button button-block">
            </a>
            </form>
          </div> 
        </div><!-- tab-content -->   
    </div> <!-- /form -->
    <div id="titleBar"></div>
    <script src='@routes.Assets.versioned("javascripts/loginSignup.js")'></script>
    <script>
        $('#reSendAuthForm')[0].reset();
    </script>
  </body>
</html>


參考畫面。
網址 : http://127.0.0.1:9000/web/resendAuthEmail


Step 1 : 檢查輸入的資料是否符合需要的格式。
這邊利用到Ch10-3小節所用到getSignupRequest()的方法,來驗證使用者填寫的表單是否正確。
path : /app/controllers/WebController.java

public Result goToResendAuthEmail(){

  // 清除暫存錯誤訊息
  flash().clear();

  SignupRequest request = this.getSignupRequest();
  if(request==null){
    flash().put("error", "輸入資料錯誤,請重新嘗試!!");
    return ok(resendAuthEmail.render());
  }
}

// Step 1 : 取得註冊資訊請求
private SignupRequest getSignupRequest() {
  SignupRequest request = null;
  try {
    request = formFactory.form(SignupRequest.class).bindFromRequest().get();
    Logger.info("before , new member request data = " + Json.toJson(request));
  } catch (Exception e) {
    Logger.error("表單內容非註冊資訊,轉換類別錯誤,回傳空物件");
  }
  return request;
}


檢查畫面。


Step 2 : 檢查輸入的信箱與使用名稱,是否有該會員資料。
為了確保重發認證信的使用者,是會員本人,我們需要輸入兩個欄位資訊,使用者名稱與信箱,確認是否有這個會員,才能使用這個重發認證信的功能。
path : /app/controllers/WebController.java

    // Step 2
    Member member = null;
    String email = request.getEmail();
    String username = request.getUsername();
    try{
      member = webService.findMemberByEmailAndUserName(email, username);
    } catch(Exception e){
      e.printStackTrace();
      flash().put("error", "系統忙碌中,請稍候再嘗試,謝謝。");
      return ok(resendAuthEmail.render());
    }

    // Step 2 
    if(member == null){
      flash().put("error", "查無註冊資料,請確認資料是否填寫正確,謝謝。");
      return ok(resendAuthEmail.render());
    }


先在WebService寫好查詢會員資料。
path : app/services/WebService.java

public interface WebService {
  /** 用Email與使用者名稱 尋找會員資料 */
  public Member findMemberByEmailAndUserName(@Param("email")String email , @Param("username")String username);
}


查詢會員資料的SQL語法。

<!-- 根據 email與username查尋會員資料 -->
<select id="findMemberByEmailAndUserName" parameterType="String"
    resultType="pojo.web.Member">
    SELECT * FROM member_main WHERE email = #{email} AND username =#{username}
</select>


檢查畫面(資料庫異常)。

查無會員資料。


Step 3 : 會員資料,檢查是否已認證。
若會員其實已經認證過,就不需要再次使用重發認證信的功能。
path : /app/controllers/WebController.java

member = webService.findMemberByEmailAndUserName(email, username);
...
// Step 3
if(!MemberStatus.S1.getStatus().equals(member.getStatus())){
  flash().put("error", "您的帳號,已經認證成功,不需再重新認證,謝謝。");
  play.Logger.warn("member      = " + Json.toJson(member));
  return ok(resendAuthEmail.render());
}
...


檢查畫面。


Step 4 : 尚未認證,再次補寄送認證信。
通過以上檢查後,接下來流程,跟註冊會員的最後一個幾乎步驟一樣,這邊程式碼,只列出Controller的部份,詳細流程,請參考Ch10-3的Step 6。 path : /app/controllers/WebController.java

  {
   ....
    try{
      String signupAuthString = new Utils_Signup().genSignupAuthString(member.getEmail());
      Map<String , String> memberToken = new HashMap<String , String>();
      memberToken.put("memberNo", member.getMemberNo());
      memberToken.put("tokenString", signupAuthString);
      memberToken.put("type", MemberTokenType.Signup.toString());
      int isSignupAuthStringOk = webService.genSignupAuthData(memberToken);

      Utils_Email utils_Email = new Utils_Email();
      Email authMail = utils_Email.genSinupAuthEmail(member, signupAuthString);
      boolean isSeadMailOk = utils_Email.sendMail(authMail);

      play.Logger.info("isSignupAuthStringOk = " + isSignupAuthStringOk +" , isSeadMailOk = " + isSeadMailOk);
    } catch(Exception e){
      e.printStackTrace();
    }
    flash().put("ok", "已重發認證信,請至註冊信箱收取認證信,謝謝。");
    return ok(resendAuthEmail.render());
  }
...


已發送信件畫面。

信箱。


[Final]

到這邊,我們基本的註冊功能都已經完成,這個小節基本上是前兩個小節CH10-3與CH10-4的整合,只要前面有順利完成,這章節就會相對輕鬆許多。

results matching ""

    No results matching ""