zoukankan      html  css  js  c++  java
  • 身份验证

    为什么需要身份验证

    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:'验证失败',
              })
            }
          })
      })
     
  • 相关阅读:
    mysqldump备份数据库时排除某些库
    Dataguard后台进程解析
    mysql 查看所有存储过程
    Oracle 中的 TO_DATE 和 TO_CHAR 函数
    trunc的使用
    mysql now() sysdate() curdate()区别
    ORA-10456:cannot open standby database;media recovery session may be in process
    ORACLE 修改日志大小及增加日志成员
    Oracle 11gR2用gpnp profile存放ASM的spfile路径
    C语言malloc()函数:动态分配内存空间
  • 原文地址:https://www.cnblogs.com/anin/p/13368628.html
Copyright © 2011-2022 走看看