iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
永豐金融APIs

30天全端挑戰!React+Spring Boot+Mongo DB 串接永豐API 打造金融網站系列 第 9

[Day 09] - Spring Boot 實作登入驗證(三)(JWT實作)

  • 分享至 

  • xImage
  •  

忙碌的一天又過去了,下班回家頭昏眼花的...
要完成鐵人賽真的需要超凡意志,還好今天星期五...

好,今天終於要來實作JWT了!
因為時間有限,就以最簡單的方式來實作吧!

首先,為了產生JWT,先到pom.xml新增以下依賴:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

雖然照理來講,應該要獨立一個類別寫JWT的產生與驗證比較好,
不過,為了趕進度,我直接在先前建立的UserService內的
verifyUser方法,加入產生token的程式:

public String verifyUser(String email,String userAcct , String userPasswd){
    /*
     0000 login success
     0001 wrong email
     0002 wrong useracct
     0003 wrong passwd
     0004 acct locked
     */
    Optional<User> user=userRepo.findUserByEmail(email);
    String result="9999";
    if(user.isPresent()){
        if(user.get().getUserAccount().equals(userAcct)){
            if(user.get().getUserPassword().equals(userPasswd)){
          //新增了以下這段:
                Date expireDate = 
                //設定30min過期
                new Date(System.currentTimeMillis()+ 30 * 60 * 1000);
                String jwtToken = Jwts.builder()
                .setSubject(email) //我以email當subject
                .setExpiration(expireDate)
                //MySecret是自訂的私鑰,HS512是自選的演算法,可以任意改變
                .signWith(SignatureAlgorithm.HS512,"MySecret")
                .compact();
                //直接將JWT傳回
                result=jwtToken;
            }else{
                result="0003";
            }
        }else{
            result="0002";       
        }
    }else{
        result="0001";
    }
    return result;        
}    

我把原本驗證成功回傳的0000改成直接回傳token了
就加個幾行而已,很簡單易懂吧~

在測試時,我遇到了以下錯誤
java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
查了之後發現是要再加jaxb-api的依賴

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>

原來在java 8時,javax.xml.bind相關類別都預設在jdk裡面就有的,
但是jdk11之後就都被移除了,有需要的話要自己再手動加入jar

直接用postman測看看,
https://ithelp.ithome.com.tw/upload/images/20210924/20128973e2Dac71M9U.png

得到了:
eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZXN0NDU2QDEyMy5jY2MiLCJleHAiOjE2MzI0OTg4NDF9.Zc8RSbpc2mpQc0jeFpyTenax4kAClNagvCADs7Aq9co082KYARnJDMch7svKpheY_LHnNaKhIJ_7kwImlLemaQ

可以把token放到https://jwt.io/
確認看看是不是一個正確格式的jwt

https://ithelp.ithome.com.tw/upload/images/20210924/20128973P6J92dGoID.png

看起來ok

接下來,登入驗證的部分就剩下jwt的驗證跟spring security的設定了

預計明天把這個段落做個結尾,
其實本來是打算只花兩天在登入驗證上的,
不過剛好工作比較忙,就被我多拖了幾天/images/emoticon/emoticon33.gif


上一篇
[Day 08] - Spring Boot 實作登入驗證(二)(JWT淺析)
下一篇
[Day 10] - Spring Boot 實作登入驗證(四)(JWT登入驗證)
系列文
30天全端挑戰!React+Spring Boot+Mongo DB 串接永豐API 打造金融網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言