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

String keyId = jwt.getKeyId();

//Private Claims

Claim claim = jwt.getHeaderClaim(“owner”);

/**

  • 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{}中添加下面代码:

学习宝典

对我们开发者来说,一定要打好基础,随时准备战斗。不论寒冬是否到来,都要把自己的技术做精做深。虽然目前移动端的招聘量确实变少了,但中高端的职位还是很多的,这说明行业只是变得成熟规范起来了。竞争越激烈,产品质量与留存就变得更加重要,我们进入了技术赋能业务的时代。

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我针对Android程序员,我这边给大家整理了一套学习宝典!包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
面试真题解析】**

[外链图片转存中…(img-Pin8zdpP-1715667296145)]

【算法合集】

[外链图片转存中…(img-mgvDmzfw-1715667296147)]

【延伸Android必备知识点】

[外链图片转存中…(img-2B9oMYkL-1715667296148)]

【Android部分高级架构视频学习资源】
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值