最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js的Koa實現(xiàn)JWT用戶認證方法

 更新時間:2018年05月05日 11:00:15   作者:御焱  
本篇文章主要介紹了Node.js的Koa實現(xiàn)JWT用戶認證方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

本文介紹了Node.js的Koa實現(xiàn)JWT用戶認證方法,分享給大家,具體如下:

一、前置知識

  1. 基于Token的身份驗證
  2. Koajs 中文文檔
  3. Koa 框架教程

二、環(huán)境

  1. Microsoft Visual Studio 2017集成開發(fā)環(huán)境
  2. Node.js v8.9.4Javascript運行環(huán)境

三、開始動手,一步步來完善

1、創(chuàng)建基礎的靜態(tài)資源服務器、基礎架構(gòu)

以下是基本的代碼,實現(xiàn)靜態(tài)服務器,以及一個當token驗證異常時候的處理。

下面我們將在這個基本代碼下逐步增加注冊、登錄、信息的功能。

const path = require('path');  // 用于處理目錄路徑
const Koa = require('koa');  // web開發(fā)框架
const serve = require('koa-static'); // 靜態(tài)資源處理
const route = require('koa-route'); // 路由中間件
const jwt = require('jsonwebtoken'); // 用于簽發(fā)、解析`token`
const jwtKoa = require('koa-jwt'); // 用于路由權(quán)限控制
const koaBody = require('koa-body'); // 用于查詢字符串解析到`ctx.request.query`
const app = new Koa();
const website = {
 scheme: 'http',
 host: 'localhost',
 port: 1337,
 join: function () {
 return `${this.scheme}://${this.host}:${this.port}`
 }
}

/* jwt密鑰 */
const secret = 'secret';

/* 當token驗證異常時候的處理,如token過期、token錯誤 */
app.use((ctx, next) => {
 return next().catch((err) => {
 if (err.status === 401) {
  ctx.status = 401;
  ctx.body = {
  ok: false,
  msg: err.originalError ? err.originalError.message : err.message
  }
 } else {
  throw err;
 }
 });
});

/* 查詢字符串解析到`ctx.request.query` */
app.use(koaBody());

/* 路由權(quán)限控制 */
// 待辦事項……

/* POST /api/register 注冊 */
// 待辦事項……

/* GET /api/login 登錄 */
// 待辦事項……

/* GET /api/info 信息 */
// 待辦事項……

/* 靜態(tài)資源處理 */
app.use(serve(path.join(__dirname, 'static')));
/* 監(jiān)聽服務器端口 */
app.listen(website.port, () => {
 console.log(`${website.join()} 服務器已經(jīng)啟動!`);
});

下面,我們將在注冊、登錄、信息的注釋底下添加實現(xiàn)的代碼。

2、路由權(quán)限控制

注冊、登錄接口、其它資源不需要認證,信息接口需要認證。

/* 路由權(quán)限控制 */
app.use(jwtKoa({ secret: secret }).unless({
 // 設置login、register接口,可以不需要認證訪問
 path: [
 /^\/api\/login/,
 /^\/api\/register/,
 /^((?!\/api).)*$/ // 設置除了私有接口外的其它資源,可以不需要認證訪問
 ]
}));

3、注冊

/* POST /api/register 注冊 */
app.use(route.post('/api/register', async (ctx, next) => {
 const body = ctx.request.body;
 /*
 * body = {
 * user : '御焱',
 * password : '123456'
 * }
 */

 // 判斷 body.user 和 body.password 格式是否正確
 // 待辦事項……

 // 判斷用戶是否已經(jīng)注冊
 // 待辦事項……

 // 保存到新用戶到數(shù)據(jù)庫中
 // 待辦事項……

 // 是否注冊成功
 let 是否注冊成功 = true;
 if (是否注冊成功) {
 // 返回一個注冊成功的JOSN數(shù)據(jù)給前端
 return ctx.body = {
  ok: true,
  msg: '注冊成功',
  token: getToken({ user: body.user, password: body.password })
 }
 } else {
 // 返回一個注冊失敗的JOSN數(shù)據(jù)給前端
 return ctx.body = {
  ok: false,
  msg: '注冊失敗'
 }
 }
}));
/* 獲取一個期限為4小時的token */
function getToken(payload = {}) {
 return jwt.sign(payload, secret, { expiresIn: '4h' });
}

3、登錄

/* GET /api/login 登錄 */
app.use(route.get('/api/login', async (ctx, next) => {
 const query = ctx.request.query;
 /*
 * query = {
 * user : '御焱',
 * password : '123456'
 * }
 */

 // 判斷 query.user 和 query.password 格式是否正確
 // 待辦事項……

 // 判斷是否已經(jīng)注冊
 // 待辦事項……
 
 // 判斷姓名、學號是否正確
 // 待辦事項……
 
 return ctx.body = {
 ok: true,
 msg: '登錄成功',
 token: getToken({ user: query.user, password: query.password })
 }
}));

前端獲取到token之后,可以保存在任意本地存儲里。

4、信息

/* GET /api/info 信息 */
app.use(route.get('/api/info', async (ctx, next) => {
 // 前端訪問時會附帶token在請求頭
 payload = getJWTPayload(ctx.headers.authorization)
 /*
 * payload = {
 * user : "御焱",
 * iat : 1524042454,
 * exp : 1524056854
 * }
 */

 // 根據(jù) payload.user 查詢該用戶在數(shù)據(jù)庫中的信息
 // 待辦事項……
 const info = {
 name: '御焱',
 age: 10,
 sex: '男'
 }
 let 獲取信息成功 = true;
 if (獲取信息成功) {
 return ctx.body = {
  ok: true,
  msg: '獲取信息成功',
  data: info
 }
 } else {
 return ctx.body = {
  ok: false,
  msg: '獲取信息失敗'
 }
 }
}));
/* 通過token獲取JWT的payload部分 */
function getJWTPayload(token) {
 // 驗證并解析JWT
 return jwt.verify(token.split(' ')[1], secret);
}

訪問需要認證的接口時,需要在request頭附帶Authorization:Bearer [token]字段。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

原文鏈接地址:https://segmentfault.com/a/1190000014727547

相關文章

  • NodeJs下的測試框架Mocha的簡單介紹

    NodeJs下的測試框架Mocha的簡單介紹

    本篇文章主要介紹了NodeJs下的測試框架Mocha的簡單介紹,是目前最為流行的javascript框架之一,在本文我們重點介紹它在NodeJs上的使用。有興趣的可以了解一下。
    2017-02-02
  • 詳解Node中導入模塊require和import的區(qū)別

    詳解Node中導入模塊require和import的區(qū)別

    本篇文章主要介紹了詳解Node中導入模塊require和import的區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-08-08
  • 在nodejs中創(chuàng)建child process的方法

    在nodejs中創(chuàng)建child process的方法

    這篇文章主要介紹了在nodejs中創(chuàng)建child process的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • node基于async/await對mysql進行封裝

    node基于async/await對mysql進行封裝

    這篇文章主要介紹了node基于async/await對mysql進行封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下
    2019-06-06
  • Node.js實現(xiàn)登錄注冊功能

    Node.js實現(xiàn)登錄注冊功能

    這篇文章主要為大家詳細介紹了Node.js實現(xiàn)登錄注冊功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Node的stream數(shù)據(jù)流你了解嗎

    Node的stream數(shù)據(jù)流你了解嗎

    這篇文章主要為大家詳細介紹了Node的stream數(shù)據(jù)流,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • NodeJs基本語法和類型

    NodeJs基本語法和類型

    這篇文章主要介紹了NodeJs基本語法和類型的相關資料,需要的朋友可以參考下
    2015-02-02
  • 手把手教你如何使用nodejs編寫cli命令行

    手把手教你如何使用nodejs編寫cli命令行

    這篇文章主要介紹了手把手教你如何使用nodejs編寫cli命令行,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 一文詳解NPM如何換源

    一文詳解NPM如何換源

    在每一次的實際開發(fā)過程中我們都會下載相關的依賴包,最官方的是 npm,但是該服務器對于國內(nèi)開發(fā)者來說,下載起來是比較慢的,所以我們需要換源,下面這篇文章主要給大家介紹了關于NPM如何換源的相關資料,需要的朋友可以參考下
    2023-02-02
  • nodejs配置express服務器運行自動打開瀏覽器詳細步驟

    nodejs配置express服務器運行自動打開瀏覽器詳細步驟

    在nodejs中使用express來搭建框架可以說是非常的簡單方便,下面這篇文章主要給大家介紹了關于nodejs配置express服務器運行自動打開瀏覽器的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01

最新評論

乌海市| 沾化县| 安陆市| 措勤县| 青铜峡市| 临桂县| 潼关县| 五峰| 田林县| 临沭县| 鄂州市| 民乐县| 靖州| 昌邑市| 临江市| 岗巴县| 新乡市| 修文县| 周宁县| 牟定县| 新泰市| 广水市| 米林县| 灵璧县| 星座| 夹江县| 永登县| 绥芬河市| 全州县| 华宁县| 卓资县| 县级市| 汨罗市| 焉耆| 梁山县| 喀喇沁旗| 昆明市| 北宁市| 通道| 丘北县| 隆德县|