国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Node.js的Koa實現JWT用戶認證方法

2019-11-19 13:54:53
字體:
來源:轉載
供稿:網友

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

一、前置知識

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

二、環境

  1. Microsoft Visual Studio 2017集成開發環境
  2. Node.js v8.9.4Javascript運行環境

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

1、創建基礎的靜態資源服務器、基礎架構

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

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

const path = require('path');  // 用于處理目錄路徑const Koa = require('koa');  // web開發框架const serve = require('koa-static'); // 靜態資源處理const route = require('koa-route'); // 路由中間件const jwt = require('jsonwebtoken'); // 用于簽發、解析`token`const jwtKoa = require('koa-jwt'); // 用于路由權限控制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());/* 路由權限控制 */// 待辦事項……/* POST /api/register 注冊 */// 待辦事項……/* GET /api/login 登錄 */// 待辦事項……/* GET /api/info 信息 */// 待辦事項……/* 靜態資源處理 */app.use(serve(path.join(__dirname, 'static')));/* 監聽服務器端口 */app.listen(website.port, () => { console.log(`${website.join()} 服務器已經啟動!`);});

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

2、路由權限控制

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

/* 路由權限控制 */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 格式是否正確 // 待辦事項…… // 判斷用戶是否已經注冊 // 待辦事項…… // 保存到新用戶到數據庫中 // 待辦事項…… // 是否注冊成功 let 是否注冊成功 = true; if (是否注冊成功) { // 返回一個注冊成功的JOSN數據給前端 return ctx.body = {  ok: true,  msg: '注冊成功',  token: getToken({ user: body.user, password: body.password }) } } else { // 返回一個注冊失敗的JOSN數據給前端 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 格式是否正確 // 待辦事項…… // 判斷是否已經注冊 // 待辦事項……  // 判斷姓名、學號是否正確 // 待辦事項……  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 * } */ // 根據 payload.user 查詢該用戶在數據庫中的信息 // 待辦事項…… 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]字段。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 肃北| 吴川市| 海伦市| 彭泽县| 略阳县| 铜山县| 浮山县| 应用必备| 宜章县| 怀集县| 无棣县| 乳源| 西贡区| 上蔡县| 甘南县| 新源县| 三亚市| 买车| 龙泉市| 波密县| 太仆寺旗| 大连市| 浪卡子县| 巨鹿县| 雷州市| 许昌市| 伊通| 伊金霍洛旗| 神农架林区| 仪陇县| 迁安市| 白玉县| 德保县| 克山县| 安阳市| 宜良县| 曲麻莱县| 靖远县| 卓资县| 萍乡市| 大安市|