關於 token 認證機制,這裡不做更多解釋。不清楚的可以看我的這篇文章:web開發中常見的認證機制
整個方案實現的流程和思路很清晰,大致分為下面幾步:
- 自定義 401 攔截中介軟體,用於攔截 token 不存在或者失效的情況
- 配置 koa-jwt
- 註冊實現
- 登入實現
該專案需要你已經裝好 mongodb,並啟動。關於 mongodb 的配置見config/index.js
。
npm run start
該專案提供了三個 api
- /api/register
- /api/login
- /api/users
其中/api/register
和/api/login
為 public api,無需token就能訪問。/users
則為 private api,需要傳入正確的 token 才能訪問。
使用了koa-jwt
中介軟體後,如果沒有token,或者token失效,該中介軟體會給出對應的錯誤資訊。如果沒有自定義中介軟體的話,會直接將koa-jwt
暴露的錯誤資訊直接返回給使用者。
// server/middlewares/errorhandle.js
export default errorhandle = (ctx, next) => ;
} else
});}
然後在index.js
中使用該中介軟體
.use(errorhandle)
在index.js
中加入koa-jwt
中介軟體。
const secert = 'jwt_secret'
.use(jwt().unless())
其中secret
是用於加密的key,不侷限於字串,也可以是乙個檔案。
//
var publickey = fs.readfilesync('/path/to/public.pub');
unless()用於設定哪些 api 是不需要通過 token 驗證的。也就是我們通常說的 public api,無需登入就能訪問的 api。在這個例子中,設定了/register
和/login
兩個 api 無需 token 檢查。
在使用koa-jwt
後,所有的路由(除了unless()
設定的路由除外)都會檢查header
首部中的 token,是否存在、是否有效。只有正確之後才能正確的訪問。
註冊很簡單,這裡只是簡單的將密碼加密,將資訊存入資料庫。實際專案中,還需要對使用者輸入的字段進行驗證。
/**
* you can register with
*/async register(ctx) = ctx.request;
try `,
}return;
}body.password = await bcrypt.hash(body.password, 5)
let user = await user.find();
if (!user.length)
} else
}} catch (error)
}
使用者輸入使用者名稱和密碼登入,如果使用者名稱和密碼正確的話,使用jsonwebtoken.sign()
生成 token,並返回給客戶端。客戶端將token儲存在本地儲存,在每次的 http 請求中,都將 token 新增在 http headerauthorazition: bearer token
中。然後後端每次去驗證該token的正確與否。只有token正確後才能訪問到對應的資源。
/** you can login with
*/async login(ctx) = ctx.request
try );
if (!user)
return;
}// 匹配密碼是否相等
if (await bcrypt.compare(body.password, user.password)) , secret),
}} else
}} catch (error)
}
需要注意的是,在使用jsonwebtoken.sign()
時,需要傳入的secret
引數,這裡的secret
必須要與 前面設定jwt()
中的secret
一致。
更多關於jsonwebtoken
的方法,可見:
在登入後,拿著返回的 token,這時候去訪問/api/users
,就能正確獲得使用者列表。
koa 實現 jwt 認證
關於 token 認證機制,這裡不做更多解釋。不清楚的可以看我的這篇文章 web開發中常見的認證機制 整個方案實現的流程和思路很清晰,大致分為下面幾步 該專案需要你已經裝好 mongodb,並啟動。關於 mongodb 的配置見config index.js。npm run start複製 該專案提...
jwt 私鑰 使用JWT實現Token認證
json web token的結構是什麼樣的 json web token由三部分組成,它們之間用圓點 連線。這三部分分別是 header payload signature 因此,乙個典型的jwt看起來是這個樣子的 xx.yyyyy.zzzzz 接下來,具體看一下每一部分 header heade...
基於JWT的Token認證機制實現
想要獲取全網 最新最全的20t 資料 請新增qq群 1022848328 乙個jwt 實際上就是乙個字串,它由三部分組成,頭部 載荷與簽名。頭部 header 頭部用於描述關於該 jwt的最基本的資訊,例如其型別以及簽名所用的演算法等。這也可以 被表示成乙個 json 物件。載荷 playload ...