JWT在Java和Android中的使用(2)

/**

  • Payload Claims

*/

//Returns the Issuer value or null if it’s not defined in the Payload.

String issuer = jwt.getIssuer();

//Returns the Subject value or null if it’s not defined in the Payload.

String subject = jwt.getSubject();

//Returns the Audience value or null if it’s not defined in the Payload.

List audience = jwt.getAudience();

//Returns the Expiration Time value or null if it’s not defined in the Payload.

Date expiresAt = jwt.getExpiresAt();

//Returns the Not Before value or null if it’s not defined in the Payload.

Date notBefore = jwt.getNotBefore();

//Returns the Issued At value or null if it’s not defined in the Payload.

Date issuedAt = jwt.getIssuedAt();

//Returns the JWT ID value or null if it’s not defined in the Payload.

String id = jwt.getId();

//Private Claims

Claim claim2 = jwt.getClaim(“isAdmin”);

} catch (JWTDecodeException exception){

//Invalid token

}

}

三、JWT在Android中的使用

最初我在安卓中也使用的上面的Java库,但发现在使用org.apache.commons.codec.binary.Base64时会与Android系统中的包出现冲突,自己尝试封装了一下并改了包名,可以成功调用,但这显然不是最好的方案。所以我在这里使用到另外一个库。我们在https://jwt.io/主页上找到Java项目的入口,我在这里选择的是"maven: io.jsonwebtoken / jjwt / 0.9.0",点击该项右下角的"View Repo"按钮即可跳转到项目Github主页进行导入。下面简单说明一下依赖库的方式。

Maven:

io.jsonwebtoken

jjwt

0.9.1

Gradle:

dependencies {

compile ‘io.jsonwebtoken:jjwt:0.9.1’

}

1.JWT生成

public String JWTGenerate() {

Map<String, Object> map = new HashMap<>();

map.put(“claim1”, “claim1value”);

map.put(“claim2”, “claim2value”);

String key = Base64.encodeToString(“secret”.getBytes(), 0);

//Key key = MacProvider.generateKey(SignatureAlgorithm.HS256);

Date exp = new Date(System.currentTimeMillis() + 60 * 1000);//过期时间

String compactJws = Jwts.builder().addClaims(map).setHeaderParam(“typ”, “JWT”)

.signWith(SignatureAlgorithm.HS256, key).setExpiration(exp).compact();

try {

Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws);

//OK, we can trust this JWT

} catch (SignatureException e) {//don’t trust the JWT!

e.printStackTrace();

} catch (ExpiredJwtException e) {//The key is expiration

e.printStackTrace();

}

return compactJws;

}

2.JWT解码

先看一下使用上面的"jjwt"库如何进行解码操作:

public void JWTParse(String jwt) {

String key = Base64.encodeToString(“secret”.getBytes(), 0);

//Key key = MacProvider.generateKey(SignatureAlgorithm.HS256);

//在解析的时候一定要传key进去,否则无法通过key的认证

Jwt parse = Jwts.parser().setSigningKey(key).parse(jwt);

Header header = parse.getHeader();

Map<String, Object> map = (Map<String, Object>) parse.getBody();

String param = (String) map.get(“param”);

}

另外还可以使用其它的库,可前往 https://github.com/auth0/JWTDecode.Android 进行学习和使用,当然,你也可以用上面提到的Java库来进行解码。

添加依赖:

compile ‘com.auth0.android:jwtdecode:1.1.1’

使用:

String token = “eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ”;

JWT jwt = new JWT(token);

/**

  • Registered Claims

*/

//Returns the Issuer value or null if it’s not defined.

String issuer = jwt.getIssuer();

//Returns the Subject value or null if it’s not defined.

String subject = jwt.getSubject();

//Returns the Audience value or an empty list if it’s not defined.

List audience = jwt.getAudience();

//Returns the Expiration Time value or null if it’s not defined.

Date expiresAt = jwt.getExpiresAt();

//Returns the Not Before value or null if it’s not defined.

Date notBefore = jwt.getNotBefore();

//Returns the Issued At value or null if it’s not defined.

Date issuedAt = jwt.getIssuedAt();

//Returns the JWT ID value or null if it’s not defined.

String id = jwt.getId();

//Time Validation

boolean isExpired = jwt.isExpired(10); // 10 seconds leeway

/**

  • Private Claims

*/

Claim claim = jwt.getClaim(“isAdmin”);

四、遇到的问题及其处理方案

在AndroidStudio编译的时候会遇到这样一个问题:

这里写图片描述

解决方案为:

在Module的build.gradle中的android{}中添加下面代码:

packagingOptions {

exclude ‘META-INF/LICENSE’

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
293-1715676222826)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值