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的整合,只要前面有順利完成,這章節就會相對輕鬆許多。