首页 > 编程知识 正文

搭建json服务器并实现鉴权的简单介绍

时间:2024-03-07 18:23:34 阅读:332083 作者:XKBP

本文目录一览:

React之模拟数据库json-server 2019-01-26

在前端开发的时候,我们有时候需要验证一些异步请求返回数据后的交互效果,那么就需要搭建一个nodejs服务器来模拟,但是需要自己去在node项目中写比较麻烦,json-server就是快速搭建这样一个node服务器,你只需要创建一个.json的文件,然后监听这个文件就可以了

这里我使用yarn本地安装并演示json-server,因为我npm已经有了全局的json-server

终端命令:

现在你已经运行了一个小的服务器,通过向 即可返回数据,但在这之前你需要先在data.json中填写数据

进入 data.json ,如下格式

打开浏览器,进入 即可看到json内容,说明能够请求服务器并返回了,终端输入

curl 也能看到json内容

JWT如何实现登录、鉴权

       JWT(JSON WEB TOKEN):JSON网络令牌,JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式在不同实体之间安全传输信息(JSON格式)。它是在Web环境下两个实体之间传输数据的一项标准。实际上传输的就是一个字符串。广义上讲JWT是一个标准的名称;狭义上JWT指的就是用来传递的那个token字符串。

       由于http协议是无状态的,所以可以认为客户端和服务端的所有交互都是新的请求,这就意味着当我们通过账号密码验证用户时,当下一个request请求时它就不会携带刚刚的资料,于是程序只能再次重新识别。JWT就是实现了以JSON的格式,在客户端和服务端安全的传输供认证使用的信息。

       根据http协议,我们并不能知道是哪个用户发出的请求,所以为了让应用能识别,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器保存为cookie,以便下次请求时发送给应用,这样应用就能识别请求来自哪个用户了,这就是传统的基于session认证。

       但是session是保存到服务器内存当中的,不能跨应用服务器共享,使得应用很难扩展,随着客户端用户量增加,独立的服务器已无法承载更多的用户,这是基于session身份认证方案的问题就会暴露出来,并且这种方案存在CSRF风险,因此随着技术的发展就有了基于Token身份认证的方案去解决这些问题。

       基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利,另外因为用户的信息是保存在分布式缓存中,这种方式就支持分布式水平扩展,支持高并发。

       由于token是保存在Redis服务器中,使用这种方式无疑加大了对Redis缓存组件的依赖和增加了硬件资源的投资。

那么我们开始介绍JWT的特点。

       服务端验证后,将部分的用户信息存放到JWT中,也就是存在token的字符串中,比如用户的email和用户的姓名等。在鉴权的流程当中,是直接从JWT中直接获取用户信息,这样减少了对Redis缓存组件的依赖,也减少了硬件资源的投入。

优点:

安全性高,防止token被伪造和篡改

自包含,减少存储开销

跨语言,支持多种语言实现

支持过期,发布者等校验

缺点:

JWT不适用存放大量信息,会造成token过长

无法作废未过期的JWT,所以需要搭配Redis使用,达到用户登出操作token即失效的要求。

一个JWT是一个字符串,其由Header(头部)、Payload(负载)和Signature(签名)三个部分组成,中间以.号分隔,其格式为Header.Payload.Signature。

按照header.payload.signature这个格式串起来,串之前注意,header和payload也要做一个base64url encoded的转换。那么最终拼出来的一个例子是:

JWT指定了七个默认claims字段供选择。

iss:发行人

sub:主题

aud:用户

exp:到期时间

nbf:在此之前不可用

iat:发布时间

jti:JWT ID用于标识该JWT

除以上默认字段外,我们还可以自定义私有字段,如下例:

{

"sub":"8208208820",

"name":"hubert",

"role":"admin"

}

按照JWT标准的说明:保留的claims都是可选的,在生成payload不强制用上面的那些claim,另外你可以按照自己的想法来定义payload的结构,不过这样搞根本没必要:第一是,如果把JWT用于认证, 那么JWT标准内规定的几个claim就足够用了,假如想往JWT里多存一些用户业务信息,比如用户名(name)和角色(role)等才需要考虑添加自定义claim;第二是,JWT标准里面针对它自己规定的claim都提供了有详细的验证规则描述,每个实现库都会参照这个描述来提供JWT的验证实现,所以如果是自定义的claim名称,那么你用到的实现库就不会主动去验证这些claim。

根据源码可以发现在校验过程中主要是校验JWT字符串的格式、过期时间、加密算法正确性等。

具体校验的源码:

1 发送JWT要用https,因为JWT本身无法保证数据安全性

2 JWT的payload中不要包含太多用户信息,特别是权限角色的信息。

3 JWT的payload中建议设定一个expire时间,且不能设置太长,为什么要设置其实和cookie为什么设置过期时间一样,都是为了安全,JWT一旦生成发出去就不可以更改,在有效期内就可以永久使用。

java如何创建Json文件?

如果聊天数据的结构是固定的或变化不大的。

就直接“编排”json字符串。

为要输出的对象增加一个String toJSON()方法

StringBuilder b=new StringBuilder();

b.append("{ name:"");

b.append(username);

b.append(""}");

依次类推

return b.toString();

适合绝大多数情况。

补充:json是做交换格式,查询效率非常低,如果做存储的检索格式就误用了。

就是说“聊天信息的保存用json应该可以吧”还不如你之前的mysql数据库。

json用在客户端往服务端发送的通讯交换数据的格式上。服务端收到后转为数据库中或内存中存放。

json我就不介绍了,我主要说下怎么在cocos2dx中加入并使用json,我

一、首先去下载JsonCpp这个库。

解压后,找到include的文件夹。将它们复制到2dx工程的libs目录,然后加入到工程中。

你可以使用jsoncpp这个库了,在使用的地方引用头文件json.h就可以了。

二、jsoncpp的一些使用方法介绍:(网上也有很多介绍,我只是写下我工作中遇到的一些)

1、初始化

Json::Value root;

Json::Reader reader;

reader.parse("{"name":"sunny"}", root);

Reader可以用来初始化一个人json从字符串。

2、读取json文件初始化

这是我写的一个方法:

Json::Value BYJsonDataManager::getJsonFromFile(const char* fileName){

Json::Reader reader;

ifstream file(getFullPath(fileName));

CCAssert(file.is_open(), "file is open fail!");

Json::Value root;

if (!reader.parse(file, root, false )) {

CCAssert(false, "Json::Reader Parse error!");

}

return root;

}

const char* BYJsonDataManager::getFullPath(const char* path){

return cocos2d::CCFileUtils::sharedFileUtils()-fullPathFromRelativePath(path);

}

3、解析json

首先生成一个json

Json::Value myjson = getJsonFromFile("test.json");//利用上面的函数生成一个json。

int num = myJson["num"].asInt();

string str = myJson["name"].asString();

4、json数组

Json::Value myjson = getJsonFromFile("test.json");//利用上面的函数生成一个json。

int i = 0;

Json::Value arr = myjson[i];//获取arr数组的第一个元素

5、利用迭代器获取json的key。(有时候并不知道json的key,这个时候可以利用迭代器获取json的key)

Json::Value myjson = getJsonFromFile("test.json");//利用上面的函数生成一个json。

Json::Value::Members members(myjson.getMemberNames());

for (Json::Value::Members::iterator it = members.begin(); it != members.end(); ++it) {

const std::string key = *it;

}

6、自己拼装Json数组,(有时候发往服务器的数据是一个json数据)

Json::Value arr;

for(int i = 0 ;i 5;++i){

Json::Value myjson = getJsonFromFile("test.json");//利用上面的函数生成一个json。

arr.append(protocolData);

}

如果想让这个jsonArr有key。

Json::Value arr2;

arr2["array"] = arr;

OK ,目前只记得这些,等我想起其它的再补充。一些比较简单的没有都介绍。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。