[Day 09] - Spring Boot 实作登入验证(三)(JWT实作)

忙碌的一天又过去了,下班回家头昏眼花的...
要完成铁人赛真的需要超凡意志,还好今天星期五...

好,今天终於要来实作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 23 - Promise

【Day 02】战略资讯系统(Strategic information system)

战略资讯系统 中台架构其实是一种整体资讯架构订定的思维,其目的是为了迎接企业不断创新的挑战,在『变是...

JavaScript Day 18. 原始型别与物件型别

JavaScript 日常系列写着写着,就此进入了我的苦手范围QQ,之後的主题应该都是我的修罗场,考...

[DAY 29] Edge Computing v.s PC Computing

前言 我们知道了如何在个人电脑上执行训练/使用一个 Deep Learning Model ,更进一...

Day5 Next.js 介绍 - Production-ready 的 React.js 框架

这系列内容主要内容是在讲如何用 Next.js 取代 WordPress 前端,因此约 70% 内容...

自动化测试,让你上班拥有一杯咖啡的时间 | Day 21 - drag and drop 的用法

此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 当网站有 to-do list 时...