安卓学习日记——鉴权 1. JWT 简单方法

1. JWT 简单方法

1.1 JWT简介

1.1.1 JWT是什么

JSON Web Token 是一种标准,定义了在各方之间传输信息的URL安全方法。 该标准遵循RFC-7519规范。

1.1.2 JWT什么时候用

Authorization(授权),用户初次登录后可以得到一个令牌,在有效期内,使用户在进行请求时不再需要完成登录的动作。

Information Exchange(信息交换),安全的传输信息,JWT签名功能可以查出内容是否被篡改。

1.1.3 JWT结构

JSON类型

  • 头部(header)
  • 载荷(payload)
  • 签证(signature)

Header:

{
"alg": "HS256",    //JWT加密算法,默认HS256
"typ": "JWT"
}

JWT 各种header内容:RFC 7515 - JSON Web Signature (JWS) (ietf.org)

Payload:

所有官方字段:JSON Web Token (JWT) (iana.org)

还可以定义私有字段,例如

{
  "password": "222",
  "username": "3333"
}

Signature:

跟据Header和Payload内容加密得出,作用是防止用户篡改权限,密钥保存在服务端。

HMACSHA256(base64(header) + '.' + base64(payload))

 上面三个主要结构结合起来得到一段字符串,中间以 "." 分隔。

示例:

 1.1.4 JWT工作方式

存储可以在cookie中也可以在local storage里,验证token包括验证签名确保不被篡改和是否过期。

1.2 JWT简单实现

导入JWT的依赖

<dependency>
		<groupId>com.auth0</groupId>
		<artifactId>java-jwt</artifactId>
		<version>3.10.0</version>
</dependency>
    @ResponseBody
    @RequestMapping("/register")
    public String register(HttpServletRequest request, @RequestParam("username") String username, @RequestParam("password") String password) {
        long time =System.currentTimeMillis() + 100 * 60 * 1000;
        Date date = new Date(time);
        String SECRET_KEY = "123456789";
        Map<String, Object> map = new HashMap<>();
        map.put("alg", "HS256");
        map.put("typ", "JWT");
        String token = JWT.create()
                .withHeader(map) //可以不设定,使用默认的
                .withClaim("username",username)
                .withClaim("password",password)
                .withExpiresAt(date) //指定令牌过期时间
                .sign(Algorithm.HMAC256(SECRET_KEY));
        return token;
    }

token解析

    @ResponseBody
    @RequestMapping("/verify")
    public String verify(HttpServletRequest request, @RequestParam("token") String token){
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("123456789")).build();
        DecodedJWT decodedJWT = jwtVerifier.verify(token);
        String username = decodedJWT.getClaim("username").asString();//获取负载里面对应的内容
        String password = decodedJWT.getClaim("password").asString();
        return username+password;
    }

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值