日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Node中使用token(基于第三方包jsonwebtoken)

發(fā)布時(shí)間:2024/7/5 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Node中使用token(基于第三方包jsonwebtoken) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、jsonwebtoken 用于生成token(加密)

> jsonwebtoken

1. 安裝

npm i jsonwebtoken --save

2. 使用

2.1 引入

2.2 加密

用戶登錄成功后,后端生成token,返回給前端

二、passport、passport-jwt 用于驗(yàn)證token(解密)

passport-jwt和passport中間件來驗(yàn)證token
passport-jwt是一個(gè)針對(duì)jsonwebtoken的插件,passport是express框架的一個(gè)針對(duì)密碼的中間件
passport-jwt

  • 安裝: npm i passport-jwt passport --save

  • 在server.js 入口文件中,引入passport

  • 初始化passport,并引入passport.js文件

  • 在passport.js文件中,具體配置passport

  • const JwtStrategy = require('passport-jwt').Strategy,ExtractJwt = require('passport-jwt').ExtractJwt; // const mongoose = require("mongoose"); const {User} = require('../models/User.js') // 引入keys, 拿到secret const keys = require('../config/db.js') const opts = {} opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken(); opts.secretOrKey = keys.secretOrKey;module.exports = (passport) => {passport.use(new JwtStrategy(opts, function(jwt_payload, done) {console.log(jwt_payload)})); }

    1)請(qǐng)求/current時(shí),請(qǐng)求體帶上token的情況:



    2)請(qǐng)求/current時(shí),請(qǐng)求頭沒有帶上token的情況:



    在users表中,添加一個(gè)字段用于權(quán)限認(rèn)證,

    然后接口代碼users.js做如下修改:


  • 注冊(cè)時(shí),填寫identify身份字段,注冊(cè)成功后返回用戶的基本信息:
  • 用戶輸入正確的email和password成功登錄之后,給前端返回token
  • 前端請(qǐng)求需要登錄之后才能訪問的接口時(shí),需要在請(qǐng)求頭中加上token,攜帶上token信息,否則無法拿到接口返回的數(shù)據(jù)。
  • // 登錄 注冊(cè)模塊 const express = require("express") const router = express.Router() const bcrypt = require("bcrypt") const gravatar = require('gravatar') const jwt = require('jsonwebtoken') const keys = require('../../config/db.js')const passport = require('passport')const User = require('../../models/User')router.get("/test", (req, res) => {res.json({ msg: "login works" }) })// 注冊(cè)接口 router.post("/register", (req, res) => {console.log(req.body)// 查詢數(shù)據(jù)庫中是否存在該email的用戶User.findOne({email: req.body.email}).then((user) => {if (user) {return res.status(400).json({ msg: "郵箱已被注冊(cè)" })} else {var avatar = gravatar.url(req.body.email, {s: '200', r: 'pg', d: 'mm'});const newUser = new User({name: req.body.name,email: req.body.email,avatar: avatar,password: req.body.password,identify: req.body.identify})// 對(duì)密碼進(jìn)行加密bcrypt.genSalt(10, function (err, salt) {bcrypt.hash(newUser.password, salt, function (err, hash) {if (err) throw err;newUser.password = hashnewUser.save().then((user) => {res.json(user)}).catch((err) => {console.log(err)})});});}}) })// 登錄接口, 返回token jwt passport router.post("/login", (req, res) => {const email = req.body.emailconst password = req.body.password// 根據(jù)email查詢,數(shù)據(jù)庫中是否存在該用戶User.findOne({email: email}).then((user) => {if (!user) {return res.status(404).json({msg: '用戶不存在!'})}// 用戶存在,則檢查密碼是否一致bcrypt.compare(password, user.password).then((isMatch) => {if (isMatch) {const rule = {id: user.id, name: user.name,avatar: user.avatar,identify: user.identify}jwt.sign(rule, keys.secretOrKey, {expiresIn: 3600}, (err, token) => {if (err) throw err;return res.json({success: true,token: "Bearer " + token})})} else {return res.status(400).json({msg: '密碼錯(cuò)誤!'})}})})})// 登錄后才能訪問的接口 router.get("/current", passport.authenticate('jwt', {session: false}), (req, res) => {const {_id ,name, email, avatar, identify, date} = req.userres.json({id: _id,name: name,email: email,avatar: avatar,identify: identify,date: date}) })module.exports = router

    總結(jié)

    以上是生活随笔為你收集整理的Node中使用token(基于第三方包jsonwebtoken)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。