身份验证

为什么需要身份验证

HTTP 是一种没有状态的协议,也就是它并不知道是谁访问。客户端用户名密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再次验证

session验证方式

 

1、客户端请求身份验证

2、服务端收到请求,去数据库验证身份

3、验证成功后,服务端生成cookie-session对,把cookie或字符发送到客户端,同时服务器保留一份session

4、客户端收到 响应 以后可以把收到的字符存到cookie或localStorage

5、客户端每次向服务端请求资源的cookie会自动携带,localStorage需手动发送。

6、服务端收到请求,然后去验证cookie和session,如果验证成功,就向客户端返回请求的库数据

token验证

在服务端不需要存储用户的登录记录,全部发给客户端由客户端自己存(cookie,local)

1、客户端使用用户名跟密码请求登录

2、服务端收到请求,去验证用户名与密码

3、验证成功后,服务端会签发一个 Token(加了密的字符串),再把这个 Token 发送给客户端

4、客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里

5、客户端每次向服务端请求资源的时候需要带着服务端签发的 Token

6、服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

token优点

1.服务端无需保存信息,节省资源

2.安全,可以避免CSRF(跨站请求伪造)攻击

3.适用于CDN,因为服务端无需存状态,所以多台服务器时也可响应。

Nodejs身份验证使用方法。

session验证方式可以使用cookie-session中间件。

const cookieSession=require("cookie-session")

app.use(cookieSession({
name:'保存到服务器的session的名字',
keys:[必传参数,代表加密层级],
maxAge:1000 //保留cookie的时间
}))

app.post((req,res)=>{

req.session.key=value

})

验证时

req.session.key  返回true

删除session

delete req.session.key
req.session.key = undefined

 

token验证使用jsonwebtoken

let jwt = require('jsonwebtoken')

生成token

let token = jwt.sign(payload, secretOrPrivateKey, [options], [callback])

[payload]  json 还有username,userid
[secretOrPrivateKey]  加密规则,字符串,或者私钥path模块
[options]  可选配置项
[callback]  成功回调, 可选 返回制作后的token,也可同步返回
校验token
jwt.verify(token, secretOrPublicKey, [options], [callback])
 
[token]  制作后的token
[secretOrPublicKey]  解密规则,字符串,或者公钥
[callback:]  回调 err 错误信息 decode 成功后的信息
[options]  expiresIn 过期时间
 
 
let express=require('express');
let cookieSession=require('cookie-session');
let jwt=require('jsonwebtoken');

let app=express();
    app.listen(7755,console.log("启动服务"))
//session验证
app.use(cookieSession({
    name:"anin",
    keys:['a','b','c','d'],
    maxAge:1000*60   //单位毫秒,一分钟过期
}))
app.get('/session',(req,res,next)=>{
    req.session['ke']="0001";
    res.send({
        err:0,
        data:"写入成功"
    })
})
app.get('/secheck',(req,res,next)=>{
    if(req.session['ke']){
        res.send({
            err:0,
            data:"验证成功"
        })
    }else{
        res.send({
            err:1,
            data:"验证失败"
        })
    }
})
//删除session
//delete req.session.key 
//req.session.key = undefined

//token验证
app.get('/jwt',(req,res,next)=>{
   // jwt.sign(payload, secretOrPrivateKey, [options],[callback])
    let token = jwt.sign(
        {username:'anin', _id:'233'},
        'xyyg',
        { expiresIn: 20 //
        }
      )
    res.send({
        err: 0,
        msg:'成功',
        data:'数据',
        tk:token
      })
})
app.get('/jwtcheck',(req,res,next)=>{

    let token=req.query.tk || req.headers.tk||req.body.tk;
    //jwt.verify(token, secretOrPublicKey, [options], [callback])
    jwt.verify(token, 'xyyg', (err,decode)=>{
        console.log('err',err)
        console.log('decode',decode)//解码后数据
        if(!err){
          res.send({
            err:0,
            msg:'成功',
            data:'数据'
          })
        }else{
          res.send({
            err:1,
            msg:'验证失败',
          })
        }
      })
  })

 

 
posted @ 2020-07-24 15:53  anin  阅读(661)  评论(0编辑  收藏  举报