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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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

> jsonwebtoken

1. 安裝

npm i jsonwebtoken --save

2. 使用

2.1 引入

2.2 加密

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

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

passport-jwt和passport中間件來驗證token
passport-jwt是一個針對jsonwebtoken的插件,passport是express框架的一個針對密碼的中間件
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)請求/current時,請求體帶上token的情況:



    2)請求/current時,請求頭沒有帶上token的情況:



    在users表中,添加一個字段用于權限認證,

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


  • 注冊時,填寫identify身份字段,注冊成功后返回用戶的基本信息:
  • 用戶輸入正確的email和password成功登錄之后,給前端返回token
  • 前端請求需要登錄之后才能訪問的接口時,需要在請求頭中加上token,攜帶上token信息,否則無法拿到接口返回的數據。
  • // 登錄 注冊模塊 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" }) })// 注冊接口 router.post("/register", (req, res) => {console.log(req.body)// 查詢數據庫中是否存在該email的用戶User.findOne({email: req.body.email}).then((user) => {if (user) {return res.status(400).json({ msg: "郵箱已被注冊" })} 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})// 對密碼進行加密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// 根據email查詢,數據庫中是否存在該用戶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: '密碼錯誤!'})}})})})// 登錄后才能訪問的接口 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

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。