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

詳解Node.js使用token進(jìn)行認(rèn)證的簡(jiǎn)單示例

 更新時(shí)間:2020年05月25日 10:18:21   作者:秦老爺子  
這篇文章主要介紹了詳解Node.js使用token進(jìn)行認(rèn)證的簡(jiǎn)單示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文只介紹簡(jiǎn)單的應(yīng)用,關(guān)于json web token的具體介紹以及原理請(qǐng)參考阮一峰老師的JSON Web Token 入門教程

使用的Node框架是koa2,前端發(fā)送ajax請(qǐng)求使用axios

首先創(chuàng)建工程目錄:


static中存放靜態(tài)資源,views存放前端模板,server.js為后端代碼。

安裝必要的依賴項(xiàng):

"dependencies": {
  "@koa/router": "^8.0.8",
  "jsonwebtoken": "^8.5.1",
  "koa": "^2.12.0",
  "koa-bodyparser": "^4.3.0",
  "koa-ejs": "^4.3.0",
  "koa-jwt": "^4.0.0",
  "koa-static": "^5.0.0",
  "koa-views": "^6.2.2"
 }

在server.js中添加代碼來創(chuàng)建一個(gè)簡(jiǎn)單的后端程序,由于網(wǎng)上有太多相關(guān)示例代碼,在此不再贅述。

const koa = require('koa');
const app = new koa();
const bodyParser = require('koa-bodyparser');
const router = require('@koa/router')();
const views = require('koa-views');
const static = require('koa-static');
const path = require('path');

app.use(bodyParser());
app.use(views(__dirname + '/views', {
 map: { html: 'ejs' }
}));

app.use(static(path.join(__dirname, '/static')));

router.get('/', ctx => ctx.render('index'));

app
 .use(router.routes())
 .use(router.allowedMethods());

app.listen(8080, () => {
 console.log('server is running at port 8080');
});

const path = require('path');后添加代碼:

const { sign } = require('jsonwebtoken');
const secret = 'demo';
const jwt = require('koa-jwt')({ secret });

sign方法用來生成toekn,secret為自定義的秘鑰,jwt提供路有權(quán)限控制的功能,它會(huì)對(duì)需要限制的資源請(qǐng)求進(jìn)行檢查。

創(chuàng)建路由login:

router.post('/login', ctx => {
 const { user } = ctx.request.body;
 if (user && user.username === 'vip') {
  let { username } = user;
  const token = sign({ username }, secret, { expiresIn: '1h' });
  ctx.body = {
   message: 'GET TOKEN SUCCESS',
   status: 200,
   token
  }
 } else {
  ctx.body = {
   message: 'GET TOKEN FAILED',
   status: 500
  }
 }
});

如代碼所示,當(dāng)前端發(fā)送的請(qǐng)求體中包含一個(gè)user對(duì)象并且username為vip時(shí)將生成一個(gè)token返回給前端,這里用到了前文提到的sign方法,第一個(gè)參數(shù)是用戶信息,第二個(gè)參數(shù)是自定義的key,第三個(gè)參數(shù)是個(gè)option,此處只定義了過期時(shí)間。

再創(chuàng)建路由info:

router.get('/info', jwt, ctx => {
 ctx.body = { message: `Welcome ${ctx.state.user.username}!`};
});

與平時(shí)看到的路由代碼稍有不同,這里增加了一個(gè)jwt中間件,用來對(duì)權(quán)限進(jìn)行控制,如果無(wú)法通過驗(yàn)證,則不會(huì)執(zhí)行之后的代碼。在前文生成token后,會(huì)把用戶名存入ctx.state.user中,在這里可以直接獲取。

這時(shí)在控制臺(tái)中輸入node server啟動(dòng)該項(xiàng)目

打開index.html文件,添加一個(gè)簡(jiǎn)單的表單和一個(gè)按鈕,并引入axios:

<form>
 <input type="text" name="username">
 <button id="submit">提交</button>
</form>
<button id="get">獲取</button>
<script src="/vendors/axios.min.js"></script>

首先添加登錄的邏輯:

 document.querySelector('#submit').addEventListener('click', e => {
  e.preventDefault();
  const username = document.querySelector('input[name="username"]').value;
  axios.post('/login', { user: { username } })
   .then(response => {
    response = response.data;
    const { status, token, message } = response;
    if (status === 200) {
     localStorage.setItem('token', token);
    }
    alert(message);
   })
   .catch(error => alert(error.toString()));
 });

這里將服務(wù)端生成的token存入localStorage以便下次使用。

當(dāng)在輸入框中輸入vip并點(diǎn)擊提交按鈕,后端返回如下格式的信息:

message: "GET TOKEN SUCCESS"
status: 200
token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InZpcCIsImlhdCI6MTU5MDMyOTkxOSwiZXhwIjoxNTkwMzMzNTE5fQ.PsyLYmr-pDxxdtrBEvMccVtBr9-xtOAHdZKen4FP34c"

然后再添加獲取邏輯:

document.querySelector('#get').addEventListener('click', e => {
  e.preventDefault();
  const instance = axios.create({ headers: { authorization: `Bearer ${localStorage.getItem('token')}` } });
  instance.get('/info')
   .then(response => {
    response = response.data;
    console.log(response)
    alert(response.message);
   })
   .catch(error => alert(error.toString()));
 });

此處用到了axios.create方法,該方法可以在請(qǐng)求頭中添加token信息。用localStorage中獲取token并拼成形如authorization: Bearer token的形式,然后再用示例發(fā)送get請(qǐng)求。

此時(shí)再點(diǎn)擊獲取按鈕,會(huì)提示:


證明token是有效的。

此時(shí)去Application中把localStorage記錄清除掉,再點(diǎn)擊獲取按鈕,提示:


證明攔截成功。

完整示例可以去我的GitHub查看并下載。

到此這篇關(guān)于詳解Node.js使用token進(jìn)行認(rèn)證的簡(jiǎn)單示例的文章就介紹到這了,更多相關(guān)Node.js使用token認(rèn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nodejs簡(jiǎn)單實(shí)現(xiàn)中英文翻譯

    nodejs簡(jiǎn)單實(shí)現(xiàn)中英文翻譯

    這篇文章主要介紹了nodejs簡(jiǎn)單實(shí)現(xiàn)中英文翻譯的方法和示例,雖然還存在著不小的問題,但是也算是基本能用了,這里推薦給大家。
    2015-05-05
  • Node.js和MongoDB實(shí)現(xiàn)簡(jiǎn)單日志分析系統(tǒng)

    Node.js和MongoDB實(shí)現(xiàn)簡(jiǎn)單日志分析系統(tǒng)

    這篇文章主要介紹了Node.js和MongoDB實(shí)現(xiàn)簡(jiǎn)單日志分析系統(tǒng),本文給出了服務(wù)器端、客戶端、圖表生成、Shell自動(dòng)執(zhí)行等功能的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-04-04
  • node使用request請(qǐng)求的方法

    node使用request請(qǐng)求的方法

    這篇文章主要介紹了node使用request請(qǐng)求的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 詳解用node-images 打造簡(jiǎn)易圖片服務(wù)器

    詳解用node-images 打造簡(jiǎn)易圖片服務(wù)器

    本篇文章主要介紹了詳解用node-images 打造簡(jiǎn)易圖片服務(wù)器,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • Node.js如何對(duì)SQLite的async/await封裝詳解

    Node.js如何對(duì)SQLite的async/await封裝詳解

    這篇文章主要給大家介紹了關(guān)于Node.js如何對(duì)SQLite的async/await進(jìn)行封裝的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • puppeteer庫(kù)入門初探

    puppeteer庫(kù)入門初探

    這篇文章主要介紹了puppeteer庫(kù)入門初探,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • Node.js數(shù)據(jù)流Stream之Readable流和Writable流用法

    Node.js數(shù)據(jù)流Stream之Readable流和Writable流用法

    這篇文章介紹了Node.js數(shù)據(jù)流Stream之Readable流和Writable流的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • node.js?readline和line-reader逐行讀取文件方法

    node.js?readline和line-reader逐行讀取文件方法

    Readline是Node的原生模塊。它是專門為從任何可讀流逐行讀取內(nèi)容而開發(fā)的。它可用于從命令行讀取數(shù)據(jù),line-reader模塊是Node.js中逐行讀取文件的開源模塊。它不是本地模塊,所以你需要使用npm(節(jié)點(diǎn)包管理器)安裝它
    2022-10-10
  • nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比較

    nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEq

    這篇文章主要介紹了node項(xiàng)目中遇到使用斷言測(cè)試程序,看了下nodejs的api之后,對(duì)nodejs中assert斷言的幾個(gè)方法做個(gè)簡(jiǎn)單的記錄,需要的朋友可以參考下
    2017-09-09
  • 解決npm管理員身份install時(shí)出現(xiàn)權(quán)限的問題

    解決npm管理員身份install時(shí)出現(xiàn)權(quán)限的問題

    下面小編就為大家分享一篇解決npm管理員身份install時(shí)出現(xiàn)權(quán)限的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03

最新評(píng)論