用JWT令牌在节点JS中使用JWT令牌身份验证
#node #express #mongoose

用户身份验证是开发网站的最重要部分。为了防止用户帐户中的任何恶意活动,我们必须实施强大的身份验证系统。今天,我们将使用JSON Web令牌探索用户身份验证。



入门

首先,我们需要使用Express设置Node.js样板。确保已安装了NPM和节点

为您的项目创建目录。我们将使用服务器

进入新创建的目录内并运行

npm init

这将使用package.json文件初始化我们的项目。

现在我们需要安装Express

npm安装express

创建一个新文件index.js。

在文件中放置以下代码


const express = require('express')
const app = express()
require("./db/conn")

const PORT=8083

app.use(require("./route/router"))

app.listen(PORT, () => console.log(`connected to port number ${PORT}`))

现在我们需要另一个依赖性“猫鼬”

npm安装mongoose


数据库连接

首先,我们将连接我们的数据库。

创建一个新文件夹作为db,并在其内部创建一个文件作为conn.js

将以下代码粘贴到文件中

const mongoose=require("mongoose")

const DB=process.env.DATABASE;

mongoose.connect(DB)
.then(()=>{
console.log("connection successfull")
})
.catch((e)=>{console.log(e)})

在此代码片段中,我们通过导入Mongoose将数据库连接到MongoDB地图集。我们使用process.env.database变量从config.env文件访问数据库连接链接。 config.env文件存储自定义环境变量,可以使用dotenv库

创建该变量

创建用户集合

让我们在数据库中使用Mongoose模式创建集合

首先创建具有名称模型的新文件夹。

在文件夹中创建一个新文件user.model.js

user.model.js将拥有我们的用户数据,例如名称,电子邮件,密码。

将以下代码粘贴到user.model.js

const mongoose=require("mongoose");

const user=new mongoose.Schema({
name:{
type:String
},
email:{
type:String
},
password:{
type:String
},
token:{
type:String
}
)

const User=new mongoose.model("User",user)

module.exports=User

我们在此处为集合创建模式。
Mongoose模式定义了文档的属性,默认值,数据类型,验证器等。相比之下,Mongoose模型为数据库提供了创建,查询,更新,删除记录等的接口。

mongoose模型接受两个参数
mongoose.model(收集名称,收集模式)


安装JWT

前进之前,让我们安装JWT软件包

npm i jsonwebtoken


为用户创建路线和身份验证

创建集合后,现在可以创建路由。

在此文件夹中创建一个新文件夹“路由” Create Router.js文件

将以下代码粘贴到文件中

const express=require("express")
const router=express.Router()
const mongoose=require("mongoose")
const User=require("../model/user.model.js")

router.post("/Login",async (req,res)=>{       //Login  API

  const {email,Password}=req.body;

  if(!email || !Password){
   return res.status(403).json({error:"empty Fields"})
  }

  try{
    const exist=await User.findOne({email})
    if(exist){
      if(exist.password==Password){
        const token= await exist.generateAuthToken();
        res.cookie("authcookie",token,{
          expires:new Date(Date.now()+36000000),
          httpOnly:false,
        }) 
        res.status(200).json({token:token})                                                                                        
      }
      else{
        return res.status(401).json({error:"invalid credentials"})
      }
    }
    else{
      return res.status(401).json({error:"invalid credentials"})
}}catch(e){
  console.log(e)
  res.status(500).json({error:"wont be able to login"})
}}
)

在这里,我们正在检查电子邮件和密码是否没有空,如果我们返回状态代码403“空字段”

如果密码和电子邮件字段不是空的,我们会检查集合中的电子邮件是否存在。如果是这样,我们将输入的密码与存储的密码进行比较,以确定它们是否匹配。如果密码匹配,我们调用generateauthtoken()方法以生成身份验证令牌。

现在转到user.model.js并粘贴此代码

user.methods.generateAuthToken=async function(){
    try{
    const tokenGen= jwt.sign({_id:this._id},process.env.SECRET)//genertaes token
    this.tokens=this.tokens.splice(0,1,{token:tokenGen})
     await this.save();
     return tokenGen;
    }
     catch(e){
        console.log(e)
     }
}

generateAuthToken函数生成令牌。

jwt.sign()符号获取两个参数ID和JWT_SECRET并返回签名令牌(建议JWT_Secret存储在config.env文件中)。


创建中间件

在文件夹中创建一个新的文件夹中间件创建一个新的文件authentication.js

粘贴以下代码: -

const jwt=require("jsonwebtoken")
const User=require("../models/user.model.js")


const authenticate= async (req,res,next)=>{
    try{
    const token= req.cookies.authcookie || req.headers["x-access-token"];  // taking token

    const authnToken= jwt.verify(token,process.env.SECRET)//verfify token with secret key{token is made up of user unique id and secret key} return unique id

 const userInfo= await User.find({_id:authnToken._id},{"tokens.token":token})//finding document that matches the unique id and token 

    if(!userInfo){res.status(209).json({error:"user info is not available"})}
        req.token=token;
        req.userinfo=userInfo;
        req.userId=userInfo[0]._id;
        next();
    }
    catch(e){
        res.status(401).json({message:"Please loggin first"})
        console.log(e)
    }

}

module.exports=authenticate


jwt.verify函数将令牌和秘密密钥(由用户的唯一ID组成)作为参数。它返回用户的唯一ID。

现在,让S创建 /somepage路由并使用以下代码更新路由器。

router.get("/somepage",authetication,(req,res)=>{
console.log("working")
})

检查邮递员中的API

粘贴本地主机:8003/登录到路径

通过json

将电子邮件和密码传递

Image description

它给出令牌作为响应

现在复制此令牌

更改通往 /某人的路由,并将X access-token键包含在标记值粘贴为值的标题中。然后,发送请求

Image description

令牌由中间件验证。


结论

在本教程中,我们了解了JWT,身份验证,授权以及如何使用JWT令牌进行node.js的身份验证的API。