关于javascript:nodejs-身份认证

5次阅读

共计 5117 个字符,预计需要花费 13 分钟才能阅读完成。

请问昨天完结的早是对沉积在了明天吗,明天还来加个班更博,看在这个毅力的份上是否给亿点点举荐。

有个好消息有个坏消息,先说坏消息吧,就是在这么学上来我急需急支糖浆,来回顾回顾后面的常识,这几天学的太急了,搞得有点推着走的意思,好消息就是明天的内容是最初最初 node 的根底内容了,果然天不负我,整完而后有两个大案例,做完我就从上次温习那里开始始终温习过去,而后全副不欠账,就昂首挺胸的走进 vue 了,等等,这个学完能够进去了吧。

1.

明天的第一个内容说一下 web 开发模式,明天根本就是讲一个身份认证的内容,咱们的 web 开发模式呢分为两种,一种是服务器渲染模式,就是通过服务器进行一个字符串拼接,将 html 页面拼接进去,而后间接返回给客户端,这样一来就不须要咱们的 ajax 了,间接给客户端就能够了,他的长处呢就是前端耗时少,毕竟都给服务器做了还有前端什么事,还有他也有利于 seo 优化,他的毛病就是占用服务器资源,而且不利于前后端拆散开发效率低。

第二个模式:前后端拆散的模式,它是依赖于 ajax 的一个广泛应用,后端负责编写 api 接口,前端就负责调用接口就完事了。他的一个长处就是开发体验好、毕竟前后端拆散,用户体验也好,也加重了服务器的压力。

然而毛病就是不利于 seo 的优化。

2

而后咱们进入身份认证、

什么事身份认证?

通过肯定的伎俩对用户身份进行确认的形式。

服务器渲染开发用的就是 session 认证,而咱们的前后端拆散用的就是 jwt 认证,两者都各有各的长处谁也不让谁。

3.

先来说下 session 吧

首先理解一下 http 无状态性,就是指客户端每次的 http 申请都是独立的,间断多个申请间没有间接关系,服务器也不会被动保留每次 http 申请状态(就像收银员他能记住每个来的客户是会员吗?)

冲破无状态限度。

超市冲破这种限度的形式就是给每个会员发会员卡是吧,在咱们 web 畛域这种形式就是 cookie。

cookie,是存储在用户浏览器一段不超过 4kb 的字符串,它是由 name、value 以及有效期。安全性,适用范围的可选属性组成,在不同的域名下,咱们的 cookie 是各自独立的,每当客户端发动申请,会主动把以后域名下的所有 cookie 发给服务器,留神只是以后域名下。

他的个性就是:主动发送、域名独立、过期时限、4kb 限度

3.1

cookie 在身份认证中的作用

当咱们客户端第一次申请服务器的时候,服务器会通过响应头向客户端发送一个身份认证的 cookie,咱们的浏览器就会把这个 cookie 存储起来,当咱们下一次 申请的时候,就会间接发送这个 cookie 也就是后面说的会主动发送,即可证实身份。

要留神咱们的 cookie 是不具备安全性的,浏览器还提供了读写 cookie 的 api,所以 cookie 很容易被伪造,就像咱们的会员卡也有伪造的一样。所以不要用 cookie 存储重要数据,包含咱们 jwt 也不能存前面会说到。

3.2

那么有没有办法来进步咱们 cookie 的安全性呢?

那就是 session 认证,就好比咱们的会员卡➕刷卡的机制就能破除伪造卡了。

session 认证机制:

首先咱们的客户端登录账号密码发送了登录申请,服务器会开始验证,当验证胜利后,会将其存储在服务器的内存中,同时通过响应头返回一个对应的 cookie 字符串,咱们的浏览器就会把这个字符串保留在以后域名下,当咱们再次申请的时候,就会把域名下所有 cookie 一起发送服务器,服务器就会去找对只对应的 cookie 匹配胜利就能找到你信息了,而后就认证胜利了

3.3

说了这么多怎么来再服务器端应用咱们的 sesson,首先装置导入两部曲而后还须要配置,留神配置是固定写法,secret 是能够为任意字符串的。

配置过后就能够用 req.session 来拜访 session 对象了,将咱们的一些数据用 sessin 存储起来,而后登陆胜利又能够通过 session 取出来,当咱们退出登录还能够。destroy 办法清空 session,留神只是清空这个账户信息,不会清空他人的信息,具体代码如下:

留神看 todo 也就是咱们要做的

// 导入 express 模块
const express = require('express')
// 创立 express 的服务器实例
const app = express()

// TODO_01:请配置 Session 中间件
const session = require('express-session')
app.use(session({
  secret : 'mySession',
  resave : 'false',
  saveUninitiallized: 'ture'
}))

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

// 登录的 API 接口
app.post('/api/login', (req, res) => {
  // 判断用户提交的登录信息是否正确
  if (req.body.username !== 'admin' || req.body.password !== '000000') {return res.send({ status: 1, msg: '登录失败'})
  }

  // TODO_02:请将登录胜利后的用户信息,保留到 Session 中
  // 留神只有当下面配置了 session 之后才可能应用 req.session 这个对象
  req.session.user = req.body // 用户信息
  req.session.islogin = true // 用户的登录状态


  res.send({status: 0, msg: '登录胜利'})
})

// 获取用户姓名的接口
app.get('/api/username', (req, res) => {
  // TODO_03:请从 Session 中获取用户的名称,响应给客户端
  // 判断是否登录胜利
  if(!req.session.islogin) {return res.send({status:1, msg:'fail'})
  }
  // 登录胜利即可响应数据
  return res.send({
    status : 0,
    msg : 'success',
    username : [req.session.user.username]
  })
})

// 退出登录的接口
app.post('/api/logout', (req, res) => {
  // TODO_04:清空 Session 信息
  req.session.destroy()
  res.send({
    status : 0,
    msg : '退出登录胜利'
  })
})

// 调用 app.listen 办法,指定端口号并启动 web 服务器
app.listen(80, function () {console.log('Express server running at http://127.0.0.1:80')
})

3.

这就是 session,而后咱们看到下一个认证机制 jwt,session 须要 cookie 才可能实现是吧,但咱们的 cookie 有一个致命问题,不反对跨域,如果波及到跨域须要配置很大一堆步骤。

JWT 目前最风行跨域认证解决方案。

实现原理:首先还是客户端发动一个申请头发送账号密码,服务器验证,验证胜利后会通过加密生辰一个 token 字符串而后会给你返回一个 token 字符串,咱们拿到这个 token 字符串会将其存储在 localstorage 或者 sessionStorage 中,当咱们再次申请就会通过一个 authorization 的申请头将 token 发送给服务器,服务器拿到 token 就会将他还原成用户的信息对象,而后身份也就认证胜利了。

JWT 的组成部分是有三局部组成:header。patyload。signature,这个。只是宰割作用,咱们的真正信息重在两头的 payload 前后两个只是保障 token 的安全性。

怎么在 express 中来应用咱们的 token?

须要装置两个包,还须要定义密匙是本人自定义的

第四步生成 JWT 字符串的时候在 sign 这个办法外面,这个配置有效期是 token 在规定期限之内可能拿来验证的期限;

第五步将 jwt 转换为 json 这个语句当中,unless 这个语句的意思是不须要身份验证的接口

配置完第五步转换为 json 文件后咱们就能够用 req.user 来获取信息了,而这个信息就是咱们第四步把什么转换为 jwt 字符串的信息,

最初当咱们的 token 过期或者不非法就会呈现谬误,这个时候要须要一个谬误中间件

// 导入 express 模块
const express = require('express')
// 创立 express 的服务器实例
const app = express()

// TODO_01:装置并导入 JWT 相干的两个包,别离是 jsonwebtoken 和 express-jwt
const jwt = require('jsonwebtoken')
const expressJwt = require('express-jwt')
// 容许跨域资源共享
const cors = require('cors')
app.use(cors())

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

// TODO_02:定义 secret 密钥,倡议将密钥命名为 secretKey
const secretKey = 'hard hard study day day up'
// TODO_04:注册将 JWT 字符串解析还原成 JSON 对象的中间件
app.use(expressJwt({secret : secretKey, algorithms : ['HS256']}).unless({path : [/^\/api\//]}))
// 登录接口
app.post('/api/login', function (req, res) {
  // 将 req.body 申请体中的数据,转存为 userinfo 常量
  const userinfo = req.body
  // 登录失败
  if (userinfo.username !== 'admin' || userinfo.password !== '000000') {
    return res.send({
      status: 400,
      message: '登录失败!'
    })
  }
  // 登录胜利
  // TODO_03:在登录胜利之后,调用 jwt.sign() 办法生成 JWT 字符串。并通过 token 属性发送给客户端
  // 转化成 token 加密文件
  const tokenStr = jwt.sign({username : userinfo.username, algorithms : ['HS256']}, secretKey, {expiresIn : '1h'})
  res.send({
    status: 200,
    message: '登录胜利!',
    token: tokenStr // 要发送给客户端的 token 字符串
  })
})

// 这是一个有权限的 API 接口
app.get('/admin/getinfo', function (req, res) {
  // TODO_05:应用 req.user 获取用户信息,并应用 data 属性将用户信息发送给客户端
  
  res.send({
    status: 200,
    message: '获取用户信息胜利!',
    data: {username : req.user} // 要发送给客户端的用户信息
  })
})

// TODO_06:应用全局错误处理中间件,捕捉解析 JWT 失败后产生的谬误
app.use((err, req, res, next) => {if (err.name === 'UnauthorizedError') {
    // 这次谬误是由 token 解析失败导致的
    return res.send({status : 401, msg : '有效的 token'})
  }else {
    // 其余谬误
    return res.send({status: 500, msg : '未知的谬误'})
  }
})
// 调用 app.listen 办法,指定端口号并启动 web 服务器
app.listen(8888, function () {console.log('Express server running at http://127.0.0.1:8888')
})

而后前面会有两个我的项目,会把之前所学的 node 综合起来,我到时候独自开个博来说一下吧,还是有一些注意事项的

正文完
 0