Node.js学习-day9-开发者模式

web开发者模式

主要分为两种:
服务器端渲染的概念:服务器发送给客户端的HTML页面,是在服务器通过字符串的拼接、动态生成的,因此,客户端不需要使用Ajax这样的技术额外请求页面的数据。
前后端分离的概念:前后端分离的开发者模式,依赖于Ajax技术的广泛应用。简而言之,前后端分离的Web开发模式,就是后端只负责提供API接口,前端使用Ajax调用接口的开发者模式。
服务器端渲染:身份认证推荐使用Session认证机制
前后端分离:身份认证推荐使用JWT认证机制

Session认证机制

1、HTTP协议的无状态性
HTTP协议的无状态性,指的是客户端的每次HTTP请求都是独立的,连续多个请求之间没有直接的关系,服务器不会主动保留每次HTTP请求的状态。
2、什么是Cookie
Cookie是存储在用户浏览器中的一段不超过4KB的字符串,它由一个名称(Name)、一个值(Value)和其他几个用户控制Cookie有效期、安全性、使用范围的可选属性组成。
不同域名下的Cookie各自独立,每当客户端发起请求时,会自动把当前域名下所有未过期的Cookie一同发送到服务器。
Cookie的几大特性:1)自动发送 2)域名独立 3)过期时限 4)4KB限制
3、Cookie在身份认证中的作用
客户端第一次请求服务器的时候,服务器通过响应头的形式,向客户端发送一个身份认证的Cookie,客户端会自动将Cookie保存在浏览器中,
随后,当客户端浏览器每次请求服务器的时候,浏览器会自动将身份认证相关的Cookie,通过请求头的形式发送给服务器,服务器即可验明客户端的身份。
4、Cookie不具有安全性
由于Cookie是存储在浏览器中的,而且浏览器也提供了读写Cookie的API,因此Cookie很容易被伪造,不具有安全性,因此不建议服务器将重要的隐私数据,通过Cookie的形式发送给浏览器。

在Express中使用Session认证

(1)在Express项目中,只需要安装express-session中间件,即可在项目中使用Session认证:

npm i express-session

(2)配置session

const session = require('express-session')
app.use(session({
    secret:'itheima',
    resave:false,
    saveUninitialized:true
}))

(3)向session中存数据和取数据和清空数据

const express = require('express')

const app = express()

//配置session中间件
const session = require('express-session')
app.use(session({
    secret:'itheima',
    resave:false,
    saveUninitialized:true
}))

//托管静态页面
app.use(express.static('./pages'))
//解析POST提交过来的表单数据
app.use(express.urlencoded({extended:false}))

//登录的API接口
app.post('/user/login',(req,res)=>{
    if(req.body.username !== 'admin' || req.body.password !== '000000'){
        return res.send({status:1,msg:'登录失败'})
    }

    req.session.user = req.body //用户信息
    req.session.islogin = true //用户的登录状态

    res.send({status:0,msg:'登陆成功'})
})

//获取用户姓名的接口
app.get('user/username',(req,res)=>{
    if(!req.session.islogin){
        return res.send({status:1,msg:'fail'})
    }
    res.send({
        status:0,
        msg:'success',
        username:req.session.user.username
    })
})

//退出登录的接口
//调用req.session.destroy()即可清空服务器保存的session信息
app.post('/api/logout',(req,res)=>{
    req.session.destroy()
    res.send({
        status:0,
        msg:'退出登陆成功'
    })
})

app.listen(80,()=>{
    console.log('express server running at http://127.0.0.1:80')
})

JWT认证机制

JWT是目前最流行的跨域认证解决方案。
工作原理:用户的信息通过Token字符串的形式,保存在客户端浏览器中,服务器通过还原Token字符串的形式来认证用户的身份。
JWT的三个组成部分,从前到后分别是Header、Payload、Signature,他们通过点号.分隔。
其中,Payload部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串;Header和Signature是安全性相关的部分,只是为了保证Token的安全性。
(1)JWT的使用方式
客户端收到服务器返回的JWT之后,通常将它存储在localstorage或sessionStorage中。此后,客户端每次与服务器通信,都要带上这个JWT的字符串,从而进行身份认证,推荐的做法是把JWT放在HTTP请求头的Authorization字段中。

在Express中使用JWT

(1)安装

npm install jsonwebtoken express-jwt

其中,jsonwebtoken 用于生成JWT字符串;express-jwt用于将JWT字符串解析还原成为JSON对象
(2)

//定义secret密钥,建议将密钥命名为secretKey
const secretKey = 'itheima No1 ^_^'
const express = require('express')

const app = express()

//1、安装导入JWT相关的包
const jwt = require('jsonwebtoken')
const expressJWT = require('express-jwt')


//允许跨域资源共享
const cors = require('cors')
app.use(cors())

//解析post表单数据的中间件
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({extended:false}))

//2、定义secret密钥,建议将密钥命名为secretKey
const secretKey = 'itheima No1 ^_^'

//4、注册将 JWT 字符串解析还原成 JSON 对象的中间件
//unless是配置哪些接口不需要访问权限
//只要配置成功了 express-jwt 这个中间件,就可以把解析出来的用户信息,挂载到req.user属性上
app.use(expressJWT({secret:secretKey,algorithms:['HS256']}).unless({path:[/^\/api\//]}))

//登录接口
app.post('/api/login',function(req,res){
    const userinfo = req.body
    //登录失败
    if(userinfo.username !== 'admin' || userinfo.password !== '00000'){
        return res.send({
            status:400,
            message:'登录失败!',
        })
    }
    //3、登录成功
    //登录成功后,调用jwt.sign()方法生成JWT字符串,并通过token属性发送给客户端
    //参数1:用户的信息对象 参数2:加密的密钥 参数3:配置对象,可以配置当前token的有效期
    //记住一定不要把密码加密到token字符串中
    const tokenStr = jwt.sign({uesername:userinfo.username},secretKey,{expiresIn:'30s'})
    res.send({
        status:200,
        message:'登录成功!',
        token:tokenStr,//要发送给客户端的token字符串
    })
})

//这是一个有权限的API接口
app.get('/admin/getinfo',function(req,res){
    //5、使用req.user获取用户信息,并使用data属性将用户信息发送给客户端
    console.log(req.user);
    res.send({
        status:200,
        message:'获取用户信息成功!',
        data:req.user
    })
})

//6、使用全局错误处理的中间件,捕获解析JWT失败后产生的错误
app.use((err,req,res,next)=>{
    //这次错误是由 token 解析失败导致的
    if(err.name==='UnauthorizedError'){
        return res.send({
            status:401,
            message:'无效的token'
        })
    }
    res.send({
        status:500,
        message:'未知的错误',
    })
})

app.listen(80,()=>{
    console.log('express server running at http://127.0.0.1:80')
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值