一、什么是JWT?

JWT 的定义:

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

JWT的作用:

1、JWT可以理解为一串通过特定算法生成的字符串,在API的请求中,将这段字符串放入请求参数中。API Server通过判断这段字符串是合法的还是伪造的,来确定这次API请求是否有效。通过该安全措施,将确保即使API被暴露,没有生成JWT字符串的算法,也没有办法成功调用API。
2、JWT字符串分为两个部分(官方的说法是分为3个部分),分别是‘未加密部分’和‘加密部分’。而‘加密部分’的内容实际上是‘未加密部分’加密得到的。API Server检查JWT字符串是否有效的第一步是将‘加密部分’解密然后与‘未加密部分’进行比较,查看是否内容一致。如果内容不一致,则说明该JWT字符串是伪造的。
3、JWT字符串中包括一个‘过期时间’的字段,当API Server获取到JWT字符串后,可以通过检查该字段与当前时间相比,是否已经处于过期的状态。如果‘过期时间’字段早于当前时间,则说明这次API请求是无效的。
4、你也可以在JWT字段种加入自定义的字段。然后在API Server获取到JWT字段后,通过这些自定义的字段判断是不是符合具体的业务逻辑,进而判断这次请求是不是有效。

二、JWT 基本使用步骤

1、 构造okHttp 请求

OkHttpClient mOkHttpClient = new OkHttpClient();Request request = createBuilder().url(url) .post(builder.build()) .build();mOkHttpClient.newCall(request).enqueue(new Callback(){});

2、在Request 的Header 中增加jwt 相关信息,可以作为服务端对客户端的安全校验、身份校验、权限校验等

private static Builder createBuilder() {    return (new Builder()).addHeader("Authorization", "Bearer " + generateJwt());}

3、生成 JWT 字符串

static String generateJwt() {    Date var0 = new Date();    Long var1 = Long.valueOf(var0.getTime());    Date var2 = new Date(var1.longValue() + 200000L);    HashMap var3 = new HashMap();    var3.put("typ", "JWT");    var3.put("alg", "HS256");    String var4 = "";    try {        var4 = Jwts.builder().setHeader(var3).setIssuer(sAuthOctoKey).    //请求的发起者;setIssuedAt(var0).          //请求的发起时间;setExpiration(var2).        //expTime是过期时间,当前时间+200秒;signWith(SignatureAlgorithm.HS256, Base64.encode(sAuthSecret.getBytes("UTF-8"))).   //两个参数,一个是加密算法,一个秘钥;SECRET_KEY是加密算法对应的密钥,这里使用额是HS256加密算法;.claim("key","vaule")               //该方法是在JWT中加入值为vaule 的 key 自定义字段;compact();    } catch (Exception var6) {        Log.e("HttpRequest", "octo generate error...", var6);    }    return var4;}

4、服务端判断JWT是否有效

public boolean isJwtValid(String jwt) {  try {  // 解析JWT字符串中的数据,并进行最基础的验证  Claims claims = Jwts.parser()  .setSigningKey(SECRET_KEY)  //SECRET_KEY是加密算法对应的密钥,jjwt可以自动判断机密算法;  .parseClaimsJws(jwt)   //jwt是客户端生成的JWT字符串;  .getBody();  String vaule = claims.get("key", String.class);   //获取自定义字段key;  // 判断自定义字段是否正确  if ("vaule".equals(vaule)) {  return true;  } else {  return false;  }  }  //在解析JWT字符串时,如果密钥不正确,将会解析失败,抛出SignatureException异常,说明该JWT字符串是伪造的;  //在解析JWT字符串时,如果‘过期时间字段’已经早于当前时间,将会抛出ExpiredJwtException异常,说明本次请求已经失效;  catch (SignatureException|ExpiredJwtException e) {  return false;  }}

三、对 compact() 方法的探究

io.jsonwebtoken.JwtBuilderString compact()Actually builds the JWT and serializes it to a compact, URL-safe string according to the JWT Compact Serialization rules.Returns:A compact URL-safe JWT string.

四、其他

JWT在一定程度上,保护了API的安全。但是其本身还是存在一定的缺陷的。比如说,一定JWT的加密密钥一旦被泄露,那么黑客就可以生成JWT字符串了,因此保护好JWT加密密钥非常重要。

更多相关文章

  1. android 视频 加密/解密(使用AES)
  2. Android第三十课 Jni 返回jstring字符串
  3. Android敏感词标红
  4. 【攻克Android(安卓)(40)】JSON解析
  5. Android(安卓)NDK开发之旅38--FFmpeg视频添加水印
  6. Android(安卓)资源类型 整理
  7. Android(安卓)ApiDemos示例解析(179):Views->Lists->12. Transcr
  8. Android读取资源文件夹里的string-array字符串数组
  9. android客户端序列化对象提交,服务器反序列化时出现ClassNotFoun

随机推荐

  1. android 获取 imei号码
  2. Android(安卓)Gradle Plugin指南(三)——依
  3. Android数据库组件Room
  4. android githubf地址
  5. 屏蔽应用报错弹框和无响应弹框
  6. 2011.08.12(4)——— android AudioTrack
  7. 获取当前APN,更改APN
  8. 指定Toast显示时长
  9. android ContentProvider onCreate()在 A
  10. android