金蝶云星空C#使用JWT获取token(在Newtonsoft.Json 4.0的基础上,实现Newtonsoft.Json 13.0的部分方法)

一.项目需求:

1.调用外部接口链接,需要使用JWT获取token。
(本次案例使用JWT10.0,底层调用了Newtonsoft.Json13.0的方法)

二.项目难点:

1.金蝶云星空自带的Newtonsoft.Json 4.0版本过低,不能支持JWT所需的Newtonsoft.Json 13.0方法。

三.解决方案:

解释:替换金蝶自带的Newtonsoft.Json是不可能的,金蝶云星空底层的框架是调用了Newtonsoft.Json的方法的,直接替换会导致整个系统无法运行

1.思路:
a.反编译JWT 10.0,Newtonsoft.Json 13.0。
b. 在低版本Newtonsoft.Json的基础上,重写高版本Newtonsoft.Json的方法。
(本次案例是在Newtonsoft.Json4.0的基础上,实现Newtonsoft.Json13.0的部分方法,从而实现JWT获取token)
c.步骤就是visual studio哪里报错,在反编译工具中找到报错的属性或方法,添加到自定义类中

2.使用工具:Visual Studio(开发工具),ILSpy(反编译工具)

3.操作步骤:
a.新增自定义类JsonNetSerializer
b.新增自定义静态类ExpandMethod,里面写支持JsonNetSerializer的属性,方法
c.在Visual Studio 中报错的方法或者属性,在ILSpy工具中找到并粘贴到自定义方法中
d.调试运行,方案通过

4.代码如下:

在Newtonsoft.Json 13.0的条件下,调用JWT获取token。
代码块1:

//返货Token信息
    public static string JWTEncode(string ucode)
    {

        var secretKey = AppSettingService.SecretKey;//获取jwt密钥,示例是存放到配置文件

        if (!String.IsNullOrEmpty(secretKey))
        {
            var dic = new Dictionary<string, object>();
            dic["systemName"] = ucode;//增加用户名到字典
            var expiredTimeSpan = 1;
            if (!String.IsNullOrEmpty(AppSettingService.ExpiredTimeSpan))
            {
                var timeSpan = AppSettingServ
好的,以下是一个使用koa+json+jwt+token实现的简单图书管理系统后端服务器代码示例: ```javascript const Koa = require('koa'); const bodyParser = require('koa-bodyparser'); const jwt = require('jsonwebtoken'); const app = new Koa(); const books = []; // 存储书籍信息 // JWT 密钥 const secret = 'mysecret'; // 用户信息 const users = [ { username: 'admin', password: 'admin' } ]; // 登录接口 app.use(bodyParser()); app.use(async ctx => { const { username, password } = ctx.request.body; const user = users.find(u => u.username === username && u.password === password); if (user) { const token = jwt.sign({ username }, secret, { expiresIn: '1h' }); ctx.body = { status: 'success', message: '登录成功', token }; } else { ctx.body = { status: 'fail', message: '用户名或密码错误' }; } }); // token 验证中间件 function authMiddleware(ctx, next) { const { authorization } = ctx.request.headers; if (authorization && authorization.startsWith('Bearer ')) { const token = authorization.substring(7); try { const decoded = jwt.verify(token, secret); ctx.state.user = decoded; return next(); } catch (err) { ctx.status = 401; ctx.body = { status: 'fail', message: 'token已过期或无效' }; } } else { ctx.status = 401; ctx.body = { status: 'fail', message: '缺少Authorization头或格式不正确' }; } } // 获取书籍列表 app.use(authMiddleware); app.use(async ctx => { ctx.body = { status: 'success', data: books }; }); // 新增书籍 app.use(bodyParser()); app.use(authMiddleware); app.use(async ctx => { const { title, author } = ctx.request.body; const book = { title, author }; books.push(book); ctx.body = { status: 'success', message: '添加成功' }; }); // 启动服务器 app.listen(3000, () => { console.log('Server is running on port 3000'); }); ``` 该代码实现了以下接口: 1. 登录接口 POST /login,用于验证用户身份并返回一个JWT token。 2. 获取书籍列表接口 GET /books,需要在请求头中带上JWT token。 3. 新增书籍接口 POST /books,需要在请求头中带上JWT token,并在请求体中带上title和author字段。 在使用该代码前,请确保安装了koa、koa-bodyparser和jsonwebtoken这三个依赖。另外,该代码中的用户信息和书籍信息都是存储在内存中的,实际应用中应该使用持久化存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值