JWT简介与使用(安卓注意事项)

JWT简介

token进行用户身份验证流程:
①客户端使用用户名+密码请求登录
②服务端收到请求验证用户名和密码
③验证成功后,服务端发送一个token给客户端
④客户端将token保存起来
⑤后续请求资源需要携带这个token
⑥服务端进行token验证,验证成功则执行请求

token相比于session优点:
①节约服务器资源,对移动端友好
②支持跨域访问(跨域名访问):cookie无法跨域,而token放到请求头中可不使用cookie,故跨域后不存在信息丢失问题(即发送token不是针对某个域名单独进行,任何域名使用的token可以相同,而cookie对不同域名不同处理)
③无状态:用token后,服务端不需要存储session信息,因为token包含了所有登录用户的信息,可减轻服务端压力
④更适合CDN
⑤更适用于移动端
⑥无需考虑CSRF(cookie中跨站请求伪造,即盗取cookie信息进行冒名登陆)

JWT:JSON Web Token,token的一种具体实现方式
本身就是一个字符串,将用户信息保存到JSON字符串并编码后得到(有签名信息)

JWT结构

由三部分组成:①标头(Header)②有效载荷(Payload)③签名(Signature)
传输时会将三部分分别进行Base64编码后,用‘.’进行拼接形成字符串

Header
JWT头是一个描述JWT元数据的JSON对象,alg表示签名用的算法,typ表示令牌的属性(统一JWT)

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload
有效载荷是JWT主体内容部分,也是JSON对象,包含需要传递的数据,有如下七个字段:
①iss:发行人
②exp:到期时间
③sub:主题
④aud:用户
⑤nbf:在此之前不可用
⑥iat:发布时间
⑦jti:JWT ID,用于标识该JWT
上述是JWT预定义可以选用的字段,还可以额外自定义私有字段。
给字段赋值拼接为JSON后就作为JWT的Payload部分。
注:JWT默认情况下是未加密的,只用Base64算法,可以通过内容获取传递的信息,故类似密码等用户敏感信息不能通过JWT传递。

Signature
签名哈希部分是对上述两部分数据的签名,需要使用base64编码后的header和payload数据,通过指定算法生成哈希,确保数据不被篡改。
首先需要指定一个秘钥,该密码保存在服务器中,使用签名算法(默认HMAC SHA256)生成签名。

作用
header和payload可以直接用base64获得原文。
header用于获取哈希签名使用的算法,payload获取具体数据
signature作为上述的整合,作用是检验token是否被篡改,利用获得的算法和秘钥对前两部分加密,比对加密后数据和客户端发送的是否一致。

JWT java使用

首先引入依赖:

    compile 'com.auth0:java-jwt:3.4.0'

JWT生成token:

public void testGenerateToken(){
        // 指定token过期时间为10秒
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.SECOND, 10);

        String token = JWT.create()
                .withHeader(new HashMap<>())  // Header
                .withClaim("userId", 21)  // Payload
                .withClaim("userName", "baobao")
                .withExpiresAt(calendar.getTime())  // 过期时间
                .sign(Algorithm.HMAC256("!34ADAS"));  // 签名用的secret

        System.out.println(token);
    }

头部是hashmap键值对,payload部分可以手动设置,签名部分需要由用户传入秘钥。

解析JWT字符串:

public static String checkUserToken(String token) {
        if (token != null && token.length() > 1) {
            try {
                DecodedJWT decodeJwt = JWT.require(Algorithm.HMAC256("123")).build().verify(token);
                if (decodeJwt != null) {
                    Date expriteat = decodeJwt.getExpiresAt();
                    if (expriteat.getTime() < new Date().getTime()) {
                        return "null";
                    }
                    return decodeJwt.getClaim("id").asString();
                }
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
        }
        return null;
    }

解析token字符串后,可以通过其自身预定义的字段decodeJwt.getExpiresAt()获取数据,也可以通过decodeJwt.getClaim("id")获取自定义字段。

JWT安卓使用

但上述操作在安卓可以生成JWT字符串,但解析时由于Base64冲突,无法进行。
故在安卓解析部分需要使用另一个库:

    implementation 'com.auth0.android:jwtdecode:1.1.1'

客户端只需要用base64解析header和payload部分获取数据即可

public boolean checkUserToken(String token) {
        if (token != null && token.length() > 1) {
            JWT jwt = new JWT(token);

            Date expiresAt = jwt.getExpiresAt();
            
            Claim abc = jwt.getClaim("abc");
            System.out.println(abc.asInt());
            if (expiresAt.getTime() < System.currentTimeMillis()) {
                return false;
            }
            return true;
        }
        return false;
    }

解析token字符串后,可以通过其自身预定义的字段jwt.getExpiresAt()获取数据,也可以通过jwt.getClaim("abc")获取自定义字段。

注:JAVA使用方法会将JWT检测篡改,故传入的参数还需要秘钥、算法进行签名的解码,结合其解析,说明该解法通常用于服务器,客户端不应该知道密码,并且也不需要认识篡改。
安卓用法就比较纯粹,单纯取出header和payload部分进行base64解码获取数据。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
laravel-jwt 是一个用于在 Laravel 应用程序中实现 JSON Web Token (JWT) 认证的扩展包。要配置和使用 laravel-jwt,可以按照以下步骤进行: 1. 安装扩展包:可以使用 Composer 在 Laravel 项目中安装 laravel-jwt。打开终端并运行以下命令: ``` composer require tymon/jwt-auth ``` 2. 配置扩展包:安装完成后,需要发布配置文件和生成 JWT 密钥。运行以下命令: ``` php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider" php artisan jwt:secret ``` 3. 配置环境变量:在 `.env` 文件中配置 JWT 相关的环境变量。在 `.env` 文件中添加以下配置项: ``` JWT_SECRET=your_secret_key JWT_TTL=60 ``` `your_secret_key` 是你生成的 JWT 密钥,`JWT_TTL` 是 JWT 的过期时间(以分钟为单位)。 4. 配置用户认证:打开 `config/auth.php` 文件,将 `api` 驱动程序更改为 `jwt`: ```php 'guards' => [ 'api' => [ 'driver' => 'jwt', 'provider' => 'users', ], ], ``` 5. 生成 JWT:你可以使用 `jwt()` 函数来生成 JWT。例如,可以在控制器中使用以下代码生成 JWT: ```php use Illuminate\Support\Facades\Auth; use Tymon\JWTAuth\Facades\JWTAuth; $token = JWTAuth::fromUser(Auth::user()); ``` 6. 验证 JWT:你可以使用 `jwt()` 函数来验证 JWT。例如,可以在路由中使用以下代码进行 JWT 验证: ```php Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user(); }); ``` 这些是基本的配置和使用步骤。你可以根据具体的需求进一步定制和使用 laravel-jwt。有关更多信息,请参阅 laravel-jwt 的文档。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔幻音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值