dart服务器开发性能,DartVM服务器开发(第十六天)--Jaguar使用JWT

本文介绍了JWT(Json Web Token)的基本概念和使用方法,并展示了在Dart服务器端使用Jaguar库进行JWT操作的实例,包括生成和验证JWT,以及在登录和获取用户信息接口中的应用。通过这些步骤,读者能够理解如何在Dart服务器上利用JWT进行安全的身份验证。
摘要由CSDN通过智能技术生成

今天我们来学习一下jaguar如何使用JWT!

1.JWT是什么?学习如何使用之前,我们来了解一下什么是JWT

JWT(Json Web Token)Json网络令牌,是基于Json的开放标准,是一个用私钥编码和签名的JSON数据,由于它已签名,因此无法篡改数据。在存在私钥的情况下,可以跨多个服务器验证数据(用于完整性和真实性)。

JWT令牌有三部分:Header

包含用于对令牌签名的算法,用于声明类型typ和加密算法alg,该内容使用base64加密{    "typ": "JWT",    "alg": "HS256"}Body

主要为json数据,该数据经过Base64URl编码,包含声明标准声明(建议使用)

iss: jwt签发者

sub: jwt所面向的用户

aud: 接收jwt的一方

exp: jwt的过期时间,这个过期时间必须要大于签发时间

nbf: 定义在什么时间之前,该jwt都是不可用的.

iat: jwt的签发时间

jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

公有声明

该部分可添加任何信息

私有声明

客户端与服务端共同定义的声明

Signature

根据算法,签名包含使用私钥签名的正文签名

=header.alg(base64UrlEncode(header) + "." + base64UrlEncode(body))*私钥

ok,我们了解了什么是JWT, 下面我们开始使用

2.Jaguar使用JWT添加依赖

pubspec.yaml文件下添加下面内容dependencies:#....  jaguar_jwt: ^2.1.5

然后运行pub get

AAffA0nNPuCLAAAAAElFTkSuQmCC

成功.png

可以看到,没有任何问题

导入包

我们在main.dart文件下面导入包import 'package:jaguar_jwt/jaguar_jwt.dart';使用

首先我们来声明一个私钥keyfinal key ='rhymelph123flutterdartvmser';

然后添加bodyfinal JwtClaim jwtClaim=new JwtClaim(

subject: 'rhyme',//发明者

issuer: 'jaguar',//发行的令牌

issuedAt: DateTime(2018,9,4,11,11),//发行的时间

expiry: DateTime(2018,9,6),//令牌到期时间

jwtId: '1',//唯一id

audience: ['ben','jack'],//令牌受众者

payload: { "data":"数据",},

);

根据body和key生成token,这里的大部分处理,jaguar_jwt都帮你处理好了String token = issueJwtHS256(jwtClaim, key);

通过token和key获取JwtClaimfinal jwtClaim=verifyJwtHS256Signature(token, key);

3. 实战

下面,我会通过登陆功能使用JWT

我们先定义两个接口,分别都使用post方式进行请求/api/User/Login   登陆,传入账号和密码

/api/User/Info 获取用户信息,根据传入的token

好了,接口有了,我们定义一个工具类,专门返回json数据import 'dart:convert';

ApiJson apiJson = new ApiJson();class ApiJson {  String success() =>

json.encode(new Api()

..code = 0

..msg = 'success'

..data = null,);

Api successA() =>      new Api()

..code = 0

..msg = 'success'

..data = null;  String successResult(Object data) =>

json.encode(new Api()

..code = 0

..msg = 'success'

..data = data,);

Api successResultA(Object data) =>      new Api()

..code = 0

..msg = 'success'

..data = data;  String error() =>

json.encode(new Api()

..code = -1

..msg = '未知错误'

..data = null);

Api errorA() =>      new Api()

..code = -1

..msg = '未知错误'

..data = null;  String errorMsg(int code, String msg) =>

json.encode(new Api()

..code = code

..msg = msg

..data = null);

Api errorMsgA(int code, String msg) =>      new Api()

..code = code

..msg = msg

..data = null;

}class Api {  int code;  String msg;

T data;  Map toMap() =>

{        "code": code,        "msg": msg,        "data": data,

};

}

登陆接口..post('/api/User/Login', (ctx) async{      Map params=await ctx.bodyAsUrlEncodedForm();      String username=params['username'];      String password=params['password'];      if(username.isEmpty||password.isEmpty){      //用户名或密码为空

return Response.json(apiJson.errorMsgA(-1, '用户名或密码为空!').toMap());

}else{      //在数据库中查询用户名

User user=await userBean.findOneWhere(userBean.username.eq(username));        if(user==null || user.password!=password){      //用户名或密码不正确

return Response.json(apiJson.errorMsgA(-2, '用户名或密码不正确!').toMap());

}else{//正确,返回一个token信息

final JwtClaim jwtClaim=new JwtClaim(

subject: 'rhyme',//发明者

issuer: 'jaguar',//发行的令牌

issuedAt: DateTime(2018,9,4,11,11),//发行的时间,这里的时间应该是当前时间

expiry: DateTime(2018,9,6),//令牌到期时间,该时间应该在发行时间加一两天

jwtId: '1',//唯一id

audience: ['ben','jack'],//令牌受众者

payload: user.toMap(),

);          String token=issueJwtHS256(jwtClaim, key);          return Response.json(apiJson.successResultA(token).toMap());

}

}

})

获取用户信息接口..post('/api/User/Info', (ctx) async{      Map params=await ctx.bodyAsUrlEncodedForm();      String token=params['token'];      final jwtClaim=verifyJwtHS256Signature(token, key);      return Response.json(jwtClaim.payload);

})

下面我们来请求一下吧!

AAffA0nNPuCLAAAAAElFTkSuQmCC

登陆.png

AAffA0nNPuCLAAAAAElFTkSuQmCC

请求用户信息.png

可以看到,我们成功的使用了JWT,好了,今天的内容就到这里了,我们明天见!如果想继续学习DartVM服务器开发,请关注我,学习更多骚操作!

作者:rhyme_lph

链接:https://www.jianshu.com/p/9c48fc986ffd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值