麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > JavaScript > 正文

詳解JWT token心得與使用實(shí)例

2019-11-19 11:04:58
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文你能學(xué)到什么?

token的組成
token串的生成流程。
token在客戶端與服務(wù)器端的交互流程
Token的優(yōu)點(diǎn)和思考
參考代碼:核心代碼使用參考,不是全部代碼

JWT token的組成

頭部(Header),格式如下:

{ “typ”: “JWT”, “alg”: “HS256” } 

由上可知,該token使用HS256加密算法,將頭部使用Base64編碼可得到如下個(gè)格式的字符串:

eyJhbGciOiJIUzI1NiJ9

有效載荷(Playload):

{ “iss”: “Online JWT Builder”, “iat”: 1416797419, “exp”: 1448333419, ……. “userid”:10001 } 

有效載荷中存放了token的簽發(fā)者(iss)、簽發(fā)時(shí)間(iat)、過(guò)期時(shí)間(exp)等以及一些我們需要寫進(jìn)token中的信息。有效載荷也使用Base64編碼得到如下格式的字符串:

eyJ1c2VyaWQiOjB9

簽名(Signature):

將Header和Playload拼接生成一個(gè)字符串str=“eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOjB9”,使用HS256算法和我們提供的密鑰(secret,服務(wù)器自己提供的一個(gè)字符串)對(duì)str進(jìn)行加密生成最終的JWT,即我們需要的令牌(token),形如:str.”簽名字符串”。

token在服務(wù)與客戶端的交互流程

1:客戶端通過(guò)用戶名和密碼登錄
2:服務(wù)器驗(yàn)證用戶名和密碼,若通過(guò),生成token返回給客戶端。
3:客戶端收到token后以后每次請(qǐng)求的時(shí)候都帶上這個(gè)token,相當(dāng)于一個(gè)令牌,表示我有權(quán)限訪問(wèn)了
4:服務(wù)器接收(通常在攔截器中實(shí)現(xiàn))到該token,然后驗(yàn)證該token的合法性(為什么能驗(yàn)證下面說(shuō))。若該token合法,則通過(guò)請(qǐng)求,若token不合法或者過(guò)期,返回請(qǐng)求失敗。

關(guān)于Token的思考

服務(wù)如何判斷這個(gè)token是否合法?

由上面token的生成可知,token中的簽名是由Header和有效載荷通過(guò)Base64編碼生成再通過(guò)加密算法HS256和密鑰最終生成簽名,這個(gè)簽名位于JWT的尾部,在服務(wù)器端同樣對(duì)返回過(guò)來(lái)的JWT的前部分再進(jìn)行一次簽名生成,然后比較這次生成的簽名與請(qǐng)求的JWT中的簽名是否一致,若一致說(shuō)明token合法。由于生成簽名的密鑰是服務(wù)器才知道的,所以別人難以偽造。

token中能放敏感信息嗎?
不能,因?yàn)橛行лd荷是經(jīng)過(guò)Base64編碼生成的,并不是加密。所以不能存放敏感信息。

Token的優(yōu)點(diǎn)

(1)相比于session,它無(wú)需保存在服務(wù)器,不占用服務(wù)器內(nèi)存開(kāi)銷。
(2)無(wú)狀態(tài)、可拓展性強(qiáng):比如有3臺(tái)機(jī)器(A、B、C)組成服務(wù)器集群,若session存在機(jī)器A上,session只能保存在其中一臺(tái)服務(wù)器,此時(shí)你便不能訪問(wèn)機(jī)器B、C,因?yàn)锽、C上沒(méi)有存放該Session,而使用token就能夠驗(yàn)證用戶請(qǐng)求合法性,并且我再加幾臺(tái)機(jī)器也沒(méi)事,所以可拓展性好就是這個(gè)意思。
(3)由(2)知,這樣做可就支持了跨域訪問(wèn)。

Java實(shí)例:JWT token使用

部分代碼來(lái)自互聯(lián)網(wǎng),找不到原作者了。。

編寫JWT(Java Web Token)操作類:JavaWebToken

public class JavaWebToken {  private static Logger log = LoggerFactory.getLogger(JavaWebToken.class);  //該方法使用HS256算法和Secret:bankgl生成signKey  private static Key getKeyInstance() {    //We will sign our JavaWebToken with our ApiKey secret    SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;    byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("bankgl");    Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());    return signingKey;  }  //使用HS256簽名算法和生成的signingKey最終的Token,claims中是有效載荷  public static String createJavaWebToken(Map<String, Object> claims) {    return Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, getKeyInstance()).compact();  }  //解析Token,同時(shí)也能驗(yàn)證Token,當(dāng)驗(yàn)證失敗返回null  public static Map<String, Object> parserJavaWebToken(String jwt) {    try {      Map<String, Object> jwtClaims =          Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(jwt).getBody();      return jwtClaims;    } catch (Exception e) {      log.error("json web token verify failed");      return null;    }  }}

編寫登錄Conreoller,在服務(wù)器端給客戶返回token.

public LoginStatusMessage checkUserAndPassword(  @RequestParam(value="username",required=true) String username,  @RequestParam(value="password",required=true) String password,User user,HttpServletRequest request) throws Exception{    User u = new User();    //登錄成功    if((u = userService.checkUsernameAndPassword(user)) != null){      Map<String,Object> m = new HashMap<String,Object>();      m.put("userid", user.getUserid());      String token = JavaWebToken.createJavaWebToken(m);      System.out.println(token);      LoginStatusMessage lsm = new LoginStatusMessage();      lsm.setUser(u);      lsm.setToken(token);      return lsm;    };    //登錄失敗,返回Null    return null;  }

在攔截器中對(duì)請(qǐng)求中的Token驗(yàn)證(部分代碼,表示下意思):

String token = request.getParameter("token");      if(JavaWebToken.parserJavaWebToken(token) != null){        //表示token合法        return true;      }else{        //token不合法或者過(guò)期        return false;      }

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 污污黄| 日本一道aⅴ不卡免费播放 视屏一区 | 日本中文一级片 | 九九热在线视频观看 | 91久久久久久久久久久久久 | 中文字幕在线观看免费视频 | 黄色网址免费在线播放 | 国产精品久久久免费看 | 成人毛片100部 | 国产精品91在线 | 在线播放污 | 国产毛片在线 | 一区二区久久精品66国产精品 | 午夜亚洲视频 | 91精品观看91久久久久久国产 | 一区在线视频观看 | 国产在线观看91一区二区三区 | 激情亚洲一区二区三区 | 最新黄色电影网站 | 巨根插入| 亚洲一级片在线观看 | 成年性羞羞视频免费观看 | 国产精品久久久久久久久久三级 | 欧美人一级淫片a免费播放 久久久久久久久91 国产99久久久久久免费看 | 午夜性久久| 久久第四色 | 欧美成人毛片 | 久久99精品久久久久久秒播蜜臀 | 亚洲免费视频大全 | 亚洲爱爱图 | 久久久久久久久淑女av国产精品 | av电影在线免费观看 | 亚洲免费视频大全 | 久久99国产精品视频 | 日韩欧美精品中文字幕 | 国产精品久久久久久久久久 | 国产精品久久久久久影院8一贰佰 | 国产羞羞网站 | 色999国产| 操你视频| 香蕉久草视频 |