溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用JWT 進行基于 Token 的身份驗證方法

發布時間:2020-06-16 03:53:49 來源:網絡 閱讀:1307 作者:zrmo 欄目:開發技術

一般weby應用服務都使用有狀態的session來存儲用戶狀態以便認證有權限的用戶進行的操作。但服務器在做橫向擴展時,這種有狀態的session解決方案就受到了限制。所以在一些通常的大型web應用場景越來越多在采用沒有狀態的token來進行用戶簽權處理。

需要把Web應用做成無狀態的,即服務器端無狀態,就是說服務器端不會存儲像會話這種東西,而是每次請求時access_token進行資源訪問。這里我們將使用 JWT 1,基于散列的消息認證碼,使用一個密鑰和一個消息作為輸入,生成它們的消息摘要。該密鑰只有服務端知道。訪問時使用該消息摘要進行傳播,服務端然后對該消息摘要進行驗證。

認證步驟
1.客戶端第一次使用用戶名密碼訪問認證服務器,服務器驗證用戶名和密碼,認證成功,使用用戶密鑰生成JWT并返回
2.之后每次請求客戶端帶上JWT
3.服務器對JWT進行驗證

首先使用JWTUtil類 來完成生成token和驗證token的工作

public class JwtUtil {
    private static String SECRET = "com.mozi.shop.secret";
    private static String ISSUER = "MoziShop";

    /**
     * 生成token
     *
     * @param claims
     * @return
     */
    public static String createToken(Map<String, String> claims) throws Exception {

        try {
            Algorithm algorithm = Algorithm.HMAC256(SECRET);
            JWTCreator.Builder builder = JWT.create()
                    .withIssuer(ISSUER)
                    //設置過期時間為2小時
                    .withExpiresAt(DateUtils.addHours(new Date(), 2));
            claims.forEach(builder::withClaim);
            return builder.sign(algorithm);
        } catch (Exception e) {
            throw new Exception("生成token失敗");
        }
    }

    /**
     * 驗證jwt,并返回數據
     */
    public static Map<String, String> verifyToken(String token) throws Exception {
        Algorithm algorithm;
        Map<String, Claim> map;
        try {

            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
               JWTVerifier verifier = JWT.require(algorithm).build();
               DecodedJWT jwt = verifier.verify(token);
               return true;*/
            ///
            algorithm = Algorithm.HMAC256(SECRET);
            JWTVerifier verifier = JWT.require(algorithm).withIssuer(ISSUER).build();
            //JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            map = jwt.getClaims();
        } catch (Exception e) {
            throw new Exception("鑒權失敗");
        }
        Map<String, String> resultMap = new HashMap<>(map.size());
        map.forEach((k, v) -> resultMap.put(k, v.asString()));
        return resultMap;
       }
    }

在用戶進行正常登錄操作時返回客戶端一個和失效時間的token
/**
 * 登錄頁面
 */
public void index(){
    String username = getPara("username");
    String password = getPara("password");
   // System.out.println("LOGIN USERNAME:"+username);
    if(StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)){
        Member member = new Member().dao().findByUsername(username);
        if(member == null){
            //setAttr("feedback", Feedback.error("用戶不存在"));
            setAttr("feedback", "用戶不存在");
            //System.out.println("LOGIN USERNAME 用戶不存在:"+username);
            render("/templates/"+getTheme()+"/"+getDevice()+"/login.html");
            return;
        }else if(!DigestUtils.md5Hex(password).equals(member.getPassword())){
            //setAttr("feedback", Feedback.error("用戶名密碼錯誤"));
            setAttr("feedback", "用戶名密碼錯誤");
            render("/templates/"+getTheme()+"/"+getDevice()+"/login.html");
            return;
        }else{
            /////jwt start///////////////////////////////////////////

            Map<String, String> map = new HashMap<>();
            map.put("id", (member.getId()).toString());
            map.put("name", member.getUsername());
            map.put("openid", member.getWeixinOpenId());
            String token = null;
            try {
                token = JwtUtil.createToken(map);
            }catch (Exception e) {

            }

            this.getResponse().setHeader("token", token);

            /////jwt end////////////////////////////////////////////
            redirect("/");
            return;
        }
    }else{
        System.out.println("nousername and pwd!!!!!!!!!!!!!!!");
        render("/templates/"+getTheme()+"/"+getDevice()+"/login.html");
    }
}
然后在需要授權的訪問中鑒定用戶攜帶的token,驗證有效就進行操作
        String token =  getRequest().getHeader("token");
        try {
            Map<String, String> res = JwtUtil.verifyToken(token);
            System.out.println(JSON.toJSONString(res));
        }catch (Exception e) {
            System.out.println(e);
        }
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女