搭建json伺服器並實現鑒權的簡單介紹

本文目錄一覽:

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 ,目前只記得這些,等我想起其它的再補充。一些比較簡單的沒有都介紹。

原創文章,作者:EFFIN,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/324802.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
EFFIN的頭像EFFIN
上一篇 2025-01-13 13:23
下一篇 2025-01-13 13:23

相關推薦

  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 伺服器安裝Python的完整指南

    本文將為您提供伺服器安裝Python的完整指南。無論您是一位新手還是經驗豐富的開發者,您都可以通過本文輕鬆地完成Python的安裝過程。以下是本文的具體內容: 一、下載Python…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的「畫筆」在窗口中繪製…

    編程 2025-04-29
  • STUN 伺服器

    STUN 伺服器是一個網路伺服器,可以協助網路設備(例如 VoIP 設備)解決 NAT 穿透、防火牆等問題,使得設備可以正常地進行數據傳輸。本文將從多個方面對 STUN 伺服器做詳…

    編程 2025-04-29
  • 解決docker-compose 容器時間和伺服器時間不同步問題

    docker-compose是一種工具,能夠讓您使用YAML文件來定義和運行多個容器。然而,有時候容器的時間與伺服器時間不同步,導致一些不必要的錯誤和麻煩。以下是解決方法的詳細介紹…

    編程 2025-04-29
  • JSON的MD5

    在Web開發過程中,JSON(JavaScript Object Notation)是最常用的數據格式之一。MD5(Message-Digest Algorithm 5)是一種常用…

    編程 2025-04-29
  • 使用Java將JSON寫入HDFS

    本篇文章將從以下幾個方面詳細闡述Java將JSON寫入HDFS的方法: 一、HDFS簡介 首先,先來了解一下Hadoop分散式文件系統(HDFS)。HDFS是一個可擴展性高的分散式…

    編程 2025-04-29
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28
  • Python大神作品:讓編程變得更加簡單

    Python作為一種高級的解釋性編程語言,一直被廣泛地運用於各個領域,從Web開發、遊戲開發到人工智慧,Python都扮演著重要的角色。Python的代碼簡潔明了,易於閱讀和維護,…

    編程 2025-04-28

發表回復

登錄後才能評論