用户身份验证是开发网站的最重要部分。为了防止用户帐户中的任何恶意活动,我们必须实施强大的身份验证系统。今天,我们将使用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
将电子邮件和密码传递它给出令牌作为响应
现在复制此令牌
更改通往 /某人的路由,并将X access-token键包含在标记值粘贴为值的标题中。然后,发送请求
令牌由中间件验证。
结论
在本教程中,我们了解了JWT,身份验证,授权以及如何使用JWT令牌进行node.js的身份验证的API。