欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.js的Koa實(shí)現(xiàn)JWT用戶(hù)認(rèn)證方法

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

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

一、前置知識(shí)

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

二、環(huán)境

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

三、開(kāi)始動(dòng)手,一步步來(lái)完善

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

以下是基本的代碼,實(shí)現(xiàn)靜態(tài)服務(wù)器,以及一個(gè)當(dāng)token驗(yàn)證異常時(shí)候的處理。

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

const path = require('path');  // 用于處理目錄路徑
const Koa = require('koa');  // web開(kāi)發(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'); // 用于查詢(xún)字符串解析到`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';

/* 當(dāng)token驗(yàn)證異常時(shí)候的處理,如token過(guò)期、token錯(cuò)誤 */
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;
 }
 });
});

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

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

/* POST /api/register 注冊(cè) */
// 待辦事項(xiàng)……

/* GET /api/login 登錄 */
// 待辦事項(xiàng)……

/* GET /api/info 信息 */
// 待辦事項(xiàng)……

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

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

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

注冊(cè)、登錄接口、其它資源不需要認(rèn)證,信息接口需要認(rèn)證。

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

3、注冊(cè)

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

 // 判斷 body.user 和 body.password 格式是否正確
 // 待辦事項(xiàng)……

 // 判斷用戶(hù)是否已經(jīng)注冊(cè)
 // 待辦事項(xiàng)……

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

 // 是否注冊(cè)成功
 let 是否注冊(cè)成功 = true;
 if (是否注冊(cè)成功) {
 // 返回一個(gè)注冊(cè)成功的JOSN數(shù)據(jù)給前端
 return ctx.body = {
  ok: true,
  msg: '注冊(cè)成功',
  token: getToken({ user: body.user, password: body.password })
 }
 } else {
 // 返回一個(gè)注冊(cè)失敗的JOSN數(shù)據(jù)給前端
 return ctx.body = {
  ok: false,
  msg: '注冊(cè)失敗'
 }
 }
}));
/* 獲取一個(gè)期限為4小時(shí)的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 格式是否正確
 // 待辦事項(xiàng)……

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

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

4、信息

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

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

訪(fǎng)問(wèn)需要認(rèn)證的接口時(shí),需要在request頭附帶Authorization:Bearer [token]字段。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

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

相關(guān)文章

  • 詳解nodejs中express搭建權(quán)限管理系統(tǒng)

    詳解nodejs中express搭建權(quán)限管理系統(tǒng)

    本篇文章主要介紹了詳解express搭建權(quán)限管理系統(tǒng),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Node.js系列之安裝配置與基本使用(1)

    Node.js系列之安裝配置與基本使用(1)

    這篇文章主要為大家詳細(xì)介紹了Node.js系列之安裝配置與基本使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • node.js入門(mén)學(xué)習(xí)之url模塊

    node.js入門(mén)學(xué)習(xí)之url模塊

    最近在學(xué)習(xí)nodejs,知道了如何用nodejs創(chuàng)建一個(gè)簡(jiǎn)單的小項(xiàng)目。例如如何創(chuàng)建一個(gè)服務(wù)器啦,例如http.createServer,還有根據(jù)不同的請(qǐng)求路徑來(lái)設(shè)置路由選擇啦,模塊引入,創(chuàng)建模塊啦,下面這篇文章主要介紹了node.js中url模塊的相關(guān)資料,需要的朋友可以參考下。
    2017-02-02
  • Nodejs-child_process模塊詳細(xì)介紹

    Nodejs-child_process模塊詳細(xì)介紹

    Node.js的child進(jìn)程模塊允許創(chuàng)建并行任務(wù),提高應(yīng)用性能,介紹了exec、execFile、spawn、fork等方法,解釋了它們的使用場(chǎng)景和優(yōu)勢(shì),通過(guò)子進(jìn)程模塊,可以執(zhí)行外部命令、腳本或創(chuàng)建新的Node.js實(shí)例,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • node.js中的fs.mkdirSync方法使用說(shuō)明

    node.js中的fs.mkdirSync方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.mkdirSync方法使用說(shuō)明,本文介紹了fs.mkdirSync方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js API詳解之 dgram模塊用法實(shí)例分析

    Node.js API詳解之 dgram模塊用法實(shí)例分析

    這篇文章主要介紹了Node.js API詳解之 dgram模塊用法,結(jié)合實(shí)例形式分析了Node.js API中dgram模塊基本功能、函數(shù)、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-06-06
  • koa源碼中promise的解讀

    koa源碼中promise的解讀

    這篇文章主要介紹了koa源碼中promise的解讀,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Node中的util.promisify()方法的基本使用和實(shí)現(xiàn)

    Node中的util.promisify()方法的基本使用和實(shí)現(xiàn)

    眾所周知,在JS中實(shí)現(xiàn)異步編程主要是通過(guò)以下幾種方案,回調(diào)函數(shù),觀(guān)察者模式,Generator,Promise,async / await ,今天就和大家一起聊一下在node中的一個(gè)util.promisify()這個(gè)API的基本使用和基本實(shí)現(xiàn)
    2023-07-07
  • 詳解nodejs 文本操作模塊-fs模塊(三)

    詳解nodejs 文本操作模塊-fs模塊(三)

    本篇文章主要介紹了nodejs 文本操作模塊-fs模塊(三),詳細(xì)的講訴了readFile,和writeFile方法,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2016-12-12
  • 如何利用nodejs實(shí)現(xiàn)命令行游戲

    如何利用nodejs實(shí)現(xiàn)命令行游戲

    這篇文章主要給大家介紹了關(guān)于如何利用nodejs實(shí)現(xiàn)命令行游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評(píng)論