精华内容
下载资源
问答
  • 这篇文章分享一下本人学习vue+node.js前后端...于是就在网上查资料,最后想到了用token令牌验证的方法 那咱们直接进入正题 一、前端登录时向后端发起请求,并携带登录信息 原理:前端发起登录请求,将登录信息(可以是..

    这篇文章分享一下本人学习vue+node.js前后端交互中的登录token令牌的心得

    最近准备写一个个人博客网站,前端采用的是vue+element,后端用node.js
    在做用户登录的时候就想到
    如果不给每个页面进行用户登录状态判断的话,是不是就可以直接跳过登录进行操作呢?
    显然如果让用户跳过登录直接进行网站的功能操作是不可行的
    于是就在网上查资料,最后想到了用token令牌验证的方法
    那咱们直接进入正题


    一、前端登录时向后端发起请求,并携带登录信息

    原理:前端发起登录请求,将登录信息(可以是账号密码)存入请求头header的Authorization中,后端接收Authorization中的信息进行解析

    为了方便前端接口的书写,我使用了axios进行请求的封装

    1:在vue项目中的main.js中引入axios

    import axios from 'axios' 
    

    如果你没有下载axios(如果是创建的vue项目的话,基本都会下载axios吧 0.0)
    在vue项目中打开控制台

    npm install axios -s
    

    下载完之后,同上在vue项目中的main.js中引入axios

    2.挂载axios原型

    在main.js中写这个,将$http挂载为axios原型

    Vue.prototype.$http=axios
    

    3.向后端发起请求

    怎么发起请求都不重要!只要你能成功发起请求就可以

    this.$http.post('/userLogin',this.loginForm)
    

    我用的是异步请求

    const {data: res} = await this.$http.post('/userLogin',this.loginForm)
    console.log(res)
    

    二、后端接收登录请求,判断用户id后给responce添加token令牌并发送给前端

    这里要注意一下,后端必须添加以下字段,不然会有跨域错误!
    res.header中的Authorization一定要设置,不然接不到前端发来的token

    app.use((req, res, next) => {
    	res.header('Access-Control-Allow-Origin', '*') //允许所有不同源的地址访问
    	res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization') //Content-Type必须要设置,Authorization是用户登录注册时存入的token值,可根据需求来设置,还有其他的都需要用逗号隔开
    	res.header('Access-Control-Allow-Credentials', true) // 这个必须要设置,否则解决跨域无效,注意true是字符串
    	next()
    })
    

    1、后端接到前端的账号密码之后,从数据库中判断账号密码的正确性

    我这里用的是mysql,账号密码的校验这里不做解释

     const sql =`select UserName,Sex,UserId from user  where UserId='${JSON.parse(DATA).userId}' and PassWord ='${JSON.parse(DATA).passWord}'`
    

    2.给响应添加token

    这里需要安装一个token模块 jsonwebtoken

    2.1 安装jsonwebtoken模块并简单配置

    在终端安装模块

    npm install jsonwebtoken
    

    创建一个js文件
    在这里插入图片描述

    然后简单封装配置,并把js文件expors出去

    const jwt = require('jsonwebtoken');
    const token = {
        encrypt:function(data,time){
            return jwt.sign(data,'token',{expiresIn:time})
        },
        decrypt:function(token){
            try{
                let data = jwt.verify(token,'token');
                console.log("data",data);
                return{
                    token:true,
                    id:data.id
                };
            } catch(e){
                return{
                    token:false,
                    data:e
                }
            }
        }
    
    }
    module.exports = {token}
    

    在login.js中导入文件

    const {token} = require('../Tools/token')
    

    注意上方的路径是你自己项目中token.js的路径

    2.2 根据登录用户的id,为此id添加token密钥

    使用token.excrypt方法需要传递两个参数,一个为数据,我这里用的是用户id(必须为对象格式),一个是token失效时间,这里是15天
    最后会生成一个密钥,你可以自己试试,每个密钥都可以通过解密转换成用户的id,供以后后端进行验证

    let Token =token.encrypt({id:JSON.parse(DATA).userId},'15d')
    

    下面是我自己的代码,目的是生成token后,将token与用户信息一起传给前端

    
    req.on("data",async function(DATA){
            const sql =`select UserName,Sex,UserId from user  where UserId='${JSON.parse(DATA).userId}' and PassWord ='${JSON.parse(DATA).passWord}'`
            console.log( JSON.parse(DATA).userId);
            let userInfo =await exec(sql)
            console.log("userid",JSON.parse(DATA).userId);
            //发送给前端的数据
            let User={} 
            //发送给前端的data数据 包含token等
            let data={}
            //发送给前端的meta数据 包含status msg等
            let meta={}
            if(userInfo.length>0){
                let Token =token.encrypt({id:JSON.parse(DATA).userId},'15d')
                for(var item in userInfo){
                    data['Token'] = Token
                    data['userInfo'] = userInfo[item]}
                    meta['status'] = 201
                    meta['msg'] = '登录成功!' 
                    User['data']=data
                    User['meta']=meta
                    res.send(User)
            }else{
                meta['status'] = 200
                meta['msg'] = '登录失败!'
                User['meta']=meta
                res.send(User)
            }
    
        })
    

    三、前端发送登录请求后接收到后端传来用户信息以及token,将token存入storage中

    1

    将token存入名为Token的storage中,供以后调用

    window.sessionStorage.setItem('Token', res.data.Token)
    

    2 在vue main.js中通过axios拦截器添加token,使每次请求都能将token传给后端

    这样做的话,每次请求都会将token发给后端,后端接到token后将其解密,可以判断当前用户是否处于登陆状态

    //在连接端口之前,通过axios拦截器添加token,保证拥有获取数据的权限.
    axios.interceptors.request.use(config=>{
      //console.log(config);
      //为请求头对象添加token验证的Authorization字段
      config.headers.Authorization=window.sessionStorage.getItem('Token')
      console.log(config.headers.Authorization);
      return config
    })
    

    四、后端获取token并解密

    在后端的接口函数中判断请求头中的authorization 是否存在,如果不存在,则证明用户没有登陆,如果存在,就可以进行进一步操作
    token.decrypt可以对加密的token进行解密,得到用户的id

    if(req.headers.authorization == 'null'){
            console.log("您没有权限!");
            res.send("您没有权限!")
        }else{
            let tokenData = token.decrypt(req.headers.authorization)
            console.log(tokenData);
            
                let sql =`select TITLE,BLOG_ID,TIME from blog where AUTHOR_ID=${tokenData.id}`
                let userInfo =await exec(sql)
                console.log(JSON.stringify(userInfo));
                res.send(userInfo)    
               
        }
    

    得到用户的id后就说明用户处于登录状态,就可以进行其他的操作啦!

    展开全文
  • Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

    1. Token的定义

    Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

    token是有时效的,一段时间之后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回的操作,通过token revocataion可以使一个特定的token或是一组有相同认证的token无效。

    2. 使用Token的目的

    Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

    3. Token 的优点

    扩展性强,无状态、可扩展。
    在客户端存储的Tokens是无状态的,并且能够被扩展。基于这种无状态和不存储Session信息,负载均衡器能够将用户信息从一个服务传到其他服务器上。
    如果我们将已验证的用户的信息保存在Session中,则每次请求都需要用户向已验证的服务器发送验证信息(称为Session亲和性)。用户量大时,可能会造成一些拥堵。
    而使用tokens之后这些问题都迎刃而解,因为tokens自己hold住了用户的验证信息。

    安全性强,非常适合用在 Web 应用或者移动应用上。Token 的中文有人翻译成 “令牌”,意思是:拿着这个令牌,才能过一些关卡。

    4. Token一般用在三个地方

    ①防止表单重复提交
    CSRF攻击(跨站点请求伪造)
    ③身份验证(单点登录)

    5. Token的验证过程

    (1) 客户端使用用户名跟密码请求登录 ;
    (2) 服务端收到请求,去验证用户名与密码 ;
    (3)验证成功后,服务端会签发一个 Token,再把这个 Token发送给客户端 ;
    (4)客户端收到 Token 以后可以把它存储起来,比如放在Cookie、 Local Storage、Session Storage中;
    (5)客户端每次向服务端请求资源的时候需要带着服务端签发的Token ;
    (6)服务端收到请求,采用filter过滤器,校验客户端请求带着的 Token,校验成功则返回请求数据,校验失败则返回错误码。

    token示意图:
    token图(该图片来自脚本之家https://www.jb51.net/)

    展开全文
  • token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。 JWT(json web token) 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。 { "姓名": "张三", ...

    token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。

    JWT(json web token) 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。

    {
      "姓名": "张三",
      "角色": "管理员",
      "到期时间": "2021年10月11日0点0分"
    }

    以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。

    当然,为了防止用户篡改数据,服务器在生成这个对象的时候,会给他加密一下,就是我们看到的一个长长的字符串

    初始代码

    前端

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
        <h1>token</h1>
        <input type="text" id="username" name="name" value="admin"/>
        <input type="text" id="password" name="password" value="123456"/>
        <button id="btn_login">登录,获取token</button>
    ​
        <button id="btn_testToken">没有token,不能访问</button>
        <button id="btn_delToken">删除token</button>
    ​
        <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
        <script>
            
            $('#btn_delToken').click(function(){
            })
     
           $('#btn_testToken').click(function(){
              $.ajax({
                   type:'get',
                   url:'http://localhost:3000/test',
                   success(res){
                       console.log(res);
                   }
               })
           })
    ​
           $('#btn_login').click(function(){
              $.ajax({
                   type:'post',
                   url:'http://localhost:3000/login',
                   data:{name:$('#username').val(),password:$('#password').val()},
                   success(res){
                       console.log(res);
                   }
               })
           })
           
        </script>
    </body>
    </html>

    后端代码

    const express = require('express')
    const cors = require('cors')
    const app = express();
    app.use(cors({origin:true,credentials:true}))
    ​
    app.use(express.urlencoded())
    ​
    app.post('/login',(req,res)=>{
        console.log('接收到的数据是', req.body)
        const {name, password} = req.body
        if(password === '123456') {
            res.json({msg:'登录成功'})
        } else {
            res.json({msg:'登录失败'})
        }
    })
    ​
    app.get('/test',(req,res) => {
        res.json({msg: '测试tokenOk'})
    })
    ​
    app.listen(3000, ()=>{
        console.log(3000);
    })

    服务器端:登录成功创建token

    使用第三方模块 jsonwebtoken 创建token字符串。

    基本步骤

    1. 在项目中下载安装 npm i jsonwebtoken

    2. 加载模块 const jwt = require('jsonwebtoken');

    3. 在用户登陆成功之后,调用 jwt.sign() 方法创建token, 它有如下4个参数:

    • 参数1:必填,对象形式;希望在token中保存的数据

    • 参数2:必填,字符串形式;加密的钥匙;后续验证token的时候,还需要使用

    • 参数3:可选,对象形式;配置项,比如可以配置token的有效期

    • 参数4:可选,函数形式;生成token之后的回调

    • 生成的token前面,必须拼接 Bearer 这个字符串。

    参考代码

    const express = require('express')
    const multer = require('multer')
    const cors = require('cors')
    const app = express();
    app.use(cors({origin:true,credentials:true}))
    const jwt = require('jsonwebtoken');
    app.use(express.urlencoded())
    ​
    app.post('/login',(req,res)=>{
        console.log('接收到的数据是', req.body)
        const {name, password} = req.body
        if(password === '123456') {
            // 调用生成 token 的方法
            const tokenStr = jwt.sign({name: name }, 'heima61', { expiresIn: 5 });
            const token = 'Bearer ' + tokenStr
            res.json({msg:'登录成功', token})
        } else {
            res.json({msg:'登录失败'})
        }
    })
    ​
    app.get('/test',(req,res) => {
        res.json({msg: '测试tokenOk'})
    })
    ​
    app.listen(3000, ()=>{
        console.log(3000);
    })

    浏览器端:

    保存在localStorage

    $('#btn_login').click(function(){
      $.ajax({
        type:'post',
        url:'http://localhost:3000/login',
        data:{name:$('#username').val(),password:$('#password').val()},
        success(res){
          console.log(res);
    +      localStorage.setItem('token', res.token)
        }
      })
    })

    浏览器端:发请求时手动携带token

    必须放置在Authorization中

    $('#btn_testToken').click(function(){
      $.ajax({
        type:'get',
        url:'http://localhost:3000/test',
        headers: {
    +      Authorization: localStorage.getItem('token'),
        },
        success(res){
          console.log(res);
        }
      })
    })

    服务器端:实现token认证

    选择使用 express-jwt 第三方模块进行身份认证。从模块名可以看出,该模块是专门配合express使用的。

    下载安装

    npm i express-jwt

    中间件技术-验证token

    const expressJwt = require('express-jwt');
    // app.use(jwt().unless());
    // jwt() 用于解析token,并将 token 中保存的数据 赋值给 req.user
    // unless() 约定某个接口不需要身份认证
    app.use(expressJwt({
      secret: 'heima61', // 生成token时的 钥匙,必须统一
      algorithms: ['HS256'] // 必填,加密算法,无需了解
    }).unless({
      path: ['/login'] // 除了个接口,其他都需要认证
    }));

    上述代码完成后,当一个接口请求到了服务器后,它会自动验证请求头中的 Authorization 字段了,并且会自动完成:

    • 如果没有问题

      1. 将token中保存的 数据 赋值给 req.user

      2. next()。

    • 如果有问题,则抛出错误 next(错误信息)

     


    展开全文
  • token即标志、记号的意思,在IT领域也叫作令牌。在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请、登录系统使用。token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行...

    以前的开发模式是以MVC为主,但是随着互联网行业快速的发展逐渐的演变成了前后端分离,若项目中需要做登录的话,那么token成为前后端唯一的一个凭证。

    token即标志、记号的意思,在IT领域也叫作令牌。在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请、登录系统使用。

    token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。例如在USB1.1协议中定义了4类数据包:token包、data包、handshake包和special包。主机和USB设备之间连续数据的交换可以分为三个阶段,第一个阶段由主机发送token包,不同的token包内容不一样(暗号不一样)可以告诉设备做不同的工作,第二个阶段发送data包,第三个阶段由设备返回一个handshake包。

    在HTTP请求中使用承载令牌来访问OAuth 2.0受保护的资源。拥有承载令牌的任何一方(“承载方”)都可以使用它访问相关资源(无需证明拥有加密密钥)。为了防止误用,需要防止在存储和传输中泄露承载令牌。

    OAuth允许客户端通过获取访问令牌,它在“OAuth 2.0授权”中定义框架“[RFC6749]作为”表示访问的字符串而不是使用资源直接服务的凭证。

    该令牌由服务端允许的情况下,由客户端通过某种方式向服务端发出请求,由服务端向客户端发出,客户机使用访问令牌访问由资源服务器承载的受保护的资源。该规范描述了当OAuth访问令牌是承载令牌时,如何发出受保护的资源请求。

    客户端只需要拥有token可以以任何一种方法传递token,客户端需要知道参数加密的密钥,只需要存储token即可。

    OAuth为客户端提供了一种方法来代表资源所有者访问受保护的资源。在一般情况下,客户机在访问受保护的资源之前,必须首先从资源所有者获得授权,然后将授权交换为访问令牌。访问令牌表示授权授予授予的范围、持续时间和其他属性。客户机通过向资源服务器显示访问令牌来访问受保护的资源。在某些情况下,客户端可以直接向服务端显示的发送自己的凭证。

    +--------+ +---------------+

    | |--(A)- Authorization Request ->| Resource |

    | | | Owner |

    | |

    | | +---------------+

    | |

    | | +---------------+

    | |--(C)-- Authorization Grant -->| Authorization |

    | Client | | Server |

    | |

    | | +---------------+

    | |

    | | +---------------+

    | |--(E)----- Access Token ------>| Resource |

    | | | Server |

    | |

    +--------+ +---------------+

    此方案的Authorization头字段的语法遵循[RFC2617]第2节中定义的基本方案的用法。注意,与Basic一样,它不符合[RFC2617]第1.2节中定义的通用语法,但与正在为HTTP 1.1 [HTTP- auth]开发的通用身份验证框架兼容,尽管它没有遵循其中列出的反映现有部署的首选实践。承载凭证的语法如下

    b64toke = 1*( ALPHA / DIGIT / "-" / "." / "_" / "~" / "+" / "/" ) *"="

    credentials = "Bearer" 1*SP b64token

    客户端应该使用带有承载HTTP授权方案的Authorization请求头字段使用承载令牌发出经过身份验证的请求。资源服务器必须支持此方法。

    在Internet Engineering Task Force (IETF)的白皮书中介绍Bearer Token的使用方法,那么我们平时使用token的时候姿势是否正确。应该如何正确使用token呢?

    import axios from "axios";

    axios.interceptors.request.use(config => {

    if (store.state.token) {

    config.headers.authorization = `Basic ${store.state.token}`;

    }

    return config;

    });

    照白皮书所说这样才是正确使用token的姿势。小伙伴们平时你们使用token的时候是这样的吗?

    那么除了前端有明确的使用规范,那么服务端又应该怎样有效的做好后端数据防护?在白皮书中同样也有提到过。

    根据OAuth 2.0动态客户端注册协议该规范定义了向授权服务器动态注册OAuth 2.0客户端的机制。注册请求向授权服务器发送一组所需的客户端元数据值(token)。结果的注册响应返回要在授权服务器上使用的客户机标识符和为客户机注册的客户机元数据值。然后,客户机可以使用此注册信息使用OAuth 2.0协议与授权服务器通信。该规范还定义了一组通用客户端元数据字段和值,供客户端在注册期间使用。

    为了让OAuth 2.0 [RFC6749]客户机利用OAuth 2.0授权服务器,客户机需要与服务器交互的特定信息,包括在该服务器上使用的OAuth 2.0客户端标识符。该规范描述了如何通过授权服务器动态注册OAuth 2.0客户端来获取此信息。

    抽象的动态客户端注册流程

    +--------(A)- Initial Access Token (OPTIONAL)

    |

    | +----(B)- Software Statement (OPTIONAL)

    | |

    v v

    +-----------+ +---------------+

    | |--(C)- Client Registration Request -->| Client |

    | Client or | | Registration |

    | Developer |

    | | or Client Error Response +---------------+

    +-----------+

    图中所示的抽象OAuth 2.0客户机动态注册流描述了客户机或开发人员与此规范中定义的端点之间的交互。此图没有显示错误条件。这个流程包括以下步骤

    可选地,向客户端或开发人员发出初始访问令牌,允许访问客户端注册端点。向客户端或开发人员发出初始访问令牌的方法超出了本规范的范围。

    客户端或开发人员可以选择发布一个软件声明,以便与客户端注册端点一起使用。向客户端或开发人员发出软件声明的方法超出了本规范的范围。

    客户端或开发人员使用客户端所需的注册元数据调用客户端注册端点,如果授权服务器需要初始访问令牌,则可以选择包含来自(A)的初始访问令牌。

    授权服务器注册客户机并返回客户端注册的元数据, 在服务器上唯一的客户端标识符,以及一组客户端凭据,如客户端机密(如果适用于此客户端)。

    授权类型与响应类型之间的关系

    描述的grant类型和响应类型值是部分正交的,因为它们引用传递到OAuth协议中不同端点的参数。但是,它们是相关的,因为客户机可用的grant类型影响客户机可以使用的响应类型,反之亦然。例如,包含授权代码的授权类型值意味着包含代码的响应类型值,因为这两个值都定义为OAuth 2.0授权代码授权的一部分。因此,支持这些字段的服务器应该采取步骤,以确保客户机不能将自己注册到不一致的状态,例如,通过向不一致的注册请求返回无效的客户机元数据错误响应。

    下表列出了这两个字段之间的相关性。

    +-----------------------------------------------+-------------------+

    | grant_types value includes: | response_types |

    | | value includes: |

    +-----------------------------------------------+-------------------+

    | authorization_code | code |

    | implicit | token |

    | password | (none) |

    | client_credentials | (none) |

    | refresh_token | (none) |

    | urn:ietf:params:oauth:grant-type:jwt-bearer | (none) |

    | urn:ietf:params:oauth:grant-type:saml2-bearer | (none) |

    +-----------------------------------------------+-------------------+

    向授予类型或响应类型参数引入新值的此文档的扩展和概要文件必须记录这两种参数类型之间的所有通信。

    如果发送任何人类可读的字段时没有使用语言标记,那么使用该字段的各方不能对字符串值的语言、字符集或脚本做出任何假设,而且字符串值必须按照在用户界面中显示的位置使用。为了促进互操作性,建议客户端和服务器除了使用任何特定于语言的字段外,还使用不使用任何语言标记的人可读字段,并且建议发送的任何不使用语言标记的人可读字段包含适合在各种系统上显示的值。

    例如,软件声明可以包含以下声明:

    {

    "software_id": "4NRB1-0XZABZI9E6-5SM3R",

    "client_name": "Example Statement-based Client",

    "client_uri": "https://client.example.net/"

    }

    以下非标准示例JWT包括这些声明,并且使用RS256(仅用于显示目的)进行了非对称签名。并等到如下加密字符串。

    eyJhbGciOiJSUzI1NiJ9.

    eyJzb2Z0d2FyZV9pZCI6IjROUkIxLTBYWkFCWkk5RTYtNVNNM1IiLCJjbGll

    bnRfbmFtZSI6IkV4YW1wbGUgU3RhdGVtZW50LWJhc2VkIENsaWVudCIsImNs

    aWVudF91cmkiOiJodHRwczovL2NsaWVudC5leGFtcGxlLm5ldC8ifQ.

    GHfL4QNIrQwL18BSRdE595T9jbzqa06R9BT8w409x9oIcKaZo_mt15riEXHa

    zdISUvDIZhtiyNrSHQ8K4TvqWxH6uJgcmoodZdPwmWRIEYbQDLqPNxREtYn0

    5X3AR7ia4FRjQ2ojZjk5fJqJdQ-JcfxyhK-P8BAWBd6I2LLA77IG32xtbhxY

    fHX7VhuU5ProJO8uvu3Ayv4XRhLZJY4yKfmyjiiKiPNe-Ia4SMy_d_QSWxsk

    U5XIQl5Sa2YRPMbDRXttm2TfnZM1xx70DoYi8g6czz-CPGRi4SW_S2RKHIJf

    IjoI3zTJ0Y2oe0_EJAiXbL6OyF9S5tKxDXV8JIndSA

    加密字符串由头,载荷以及密钥通过一系列的速算法生成,加密字符串与头,载荷以及密钥息息相关,一但加密字符串稍有改动,则无法解析正确解析无法通过验证。

    通过加密字符串向授权服务器注册客户端。授权服务器为该客户端分配一个惟一的客户端标识符,可选地分配一个客户端机密,并将请求中提供的元数据与已发布的客户端标识符关联起来。该请求包括在注册期间为客户端指定的任何客户端元数据参数。授权服务器可以为客户端元数据中遗漏的任何项提供默认值。

    注册端点,内容类型为application/json。该HTTP Entity Payload是一个由JSON组成的JSON文档对象和所有请求的客户端元数据值作为顶级成员那个JSON对象。

    示例:

    const Koa = require("koa");

    const Router = require("koa-router");

    const jwt = require("jsonwebtoken");

    const jwtAuth = require("koa-jwt");

    const secret = "it's a secret"; // 密钥

    const app = new Koa();

    const router = new Router();

    router.get('/api/login',async (ctx) => {

    const {username,passwd} = ctx.query;

    if(username === "aaron" && passwd == "123456"){

    const token = jwt.sign({

    data:{name:"Aaron",userId:"1"}, // 用户信息

    exp:Math.floor(Date.now()/1000)+60*60 // 过期时间

    },secret);

    ctx.body = {code:200,token};

    }

    else{

    ctx.status = 401;

    ctx.body = {code:0,message: "用户名密码错误"};

    }

    });

    router.get("/api/userinfo",jwtAuth({secret}),async (ctx) => { // jwtAuth受保护路由

    ctx.body = {code:200,data:{name:"Aaron",age:18}}

    });

    app.use(router.routes());

    app.listen(3000);

    因为最后生成的token是通过base64加密的,有些内容是可以反解的,所以千万不要在数据里面添加有关数据的敏感信息。注意注意。。。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 网上借个图按微信要求:确认此次GET请求来自微信服务器,则原样返回echostr参数内容都按要求来了,但怎么都不行,总是提示:Token校验失败,请检查确认/*** 检验签名*/public function checkSignature(){$signature ...
  • 其实很多场景都会有类似的静态密码+动态Token验证方式,比如暴雪游戏的手机App令牌、中国银行的EToken,原理类似,大概长这个样子: 笔者是一个对技术相对痴迷的人,世间万物皆可以程序化,喜欢思考其内在逻辑,...
  • PHP Token(令牌)设计

    2020-12-24 15:17:55
    如何达到目的: 怎样避免重复提交?在SESSION里要存一个数组,这个数组存放以经成功提交的token....如果别人copy你的html(token一迸copy),在提交时,理论上token里包含的session_id等于当前session...
  • 前后端分离后,如果客户端使用的原生应用(iOS,安卓),我们就无法使用cookie和session机制,所以我们使用另一套方案tokentoken机制:1.在前端对后端进行访问时,后端生成一个用base64加密的token串(包含个人信息过期...
  • 之前一直报 token 错误小程序配置消息推送,微信服务器会发送验证@RequestMapping(method = RequestMethod.GET) @ResponseBody public void get(HttpServletRequest request, HttpServletResponse response) throws ...
  • 由于通过Ajax异步更新数据仅仅部分页面刷新数据,就导致了令牌Token不能得到更新,紧接着的第二次新建或更新数据(提交表单时)失败——通过令牌验证。当然了,最简单的办法就是刷新整个页面,就导致了异步刷新...
  • 颁发token令牌
  • 对于前后端分离的项目来说session来判断...客户端接收到token后,每次请求都要把此token放到header中发给后段3.后段使用拦截器判断token的正确性和实效性。以下是具体代码:Token工具类:package com.zsd.analyst.ut...
  • 虚拟主机服务器token令牌 内容精选换一换当专属主机上的云服务器规格无法满足业务需要时,可参考本章节变更规格,升级云服务器的vCPU、内存。登录管理控制台。单击管理控制台左上角的,选择区域和项目。选择“计算 &...
  • 前言ThinkPHP出于安全的考虑增加了表单令牌Token,由于通过Ajax异步更新数据仅仅部分页面刷新数据,就导致了令牌Token不能得到更新,紧接着的第二次新建或更新数据(提交表单时)失败——通过令牌验证。...
  • ②后端处理:对于每次提交到后台的数据必须校验,也就是通过前端携带的令牌(一串唯一字符串)与后端校验来判断当前数据是否有效。 3.总结:第一种方法相对来说比较简单,但是安全系数高,第二种方法从根本上解决...
  • 什么是Token(令牌

    2021-10-16 22:18:12
    Acess Token 访问资源接口(API)时所需要的资源凭证 简单token 的组成: uid(用户唯一的身份标识) 、time (当前时间的时间戳) ,sign(签名,token的前几...验证成功后,服务端会签发一个token 并把这个token
  • TP6 令牌token验证2.1 路由验证2.2 控制器验证2.3 验证验证 0. 前言 表单令牌是为了防止表单重复提交,防止跨站请求伪造(Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常...
  • Token之前的博客已经介绍了各种登录的方式,现在直接介绍一种现在比较流行的登录方式,无状态登录,只需要客户端携带令牌就能登陆,服务器不再存储登录状态。突然粉丝量爆棚,开心死了,所以抓紧写一篇硬核代码,...
  • 项目介绍最近在做一个后台项目,目标是登录后无操作30分钟后自动过期,一直操作的情况下,过期时间一直刷新(目前考虑每次操作修改对数据库的压力)token有效期检测操作后自动刷新过期时间管理员手动登出其他登录...
  • 表单令牌验证相关的配置参数有:'TOKEN_ON'=>true,// 是否开启令牌验证'TOKEN_NAME'=>'__hash__',//令牌验证的表单隐藏字段名称'TOKEN_TYPE'=>'md5',//令牌哈希验证规则默认为MD5如果开启表单令牌验证功能...
  • 客户端模式验证token

    2021-05-26 11:45:28
    客户端模式验证token (A)客户端向认证服务器进行身份认证,并要求一个访问令牌。  向服务器发送请求,附带信息进行身份校验,校验通过后返回一个令牌。 (B)认证服务器确认无误后,向客户端提供访问令牌。 获取...
  • go语言JSON Web令牌token

    2020-12-29 11:08:04
    如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一。JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本身份验证)具有固有的优势。要了解更多信息,请直接...
  • 我的解决方案如下:html 每个表单有一个token {:token()}重写token验证,销毁后生成新的tokenclass BaseValidate extends \think\Validate {/*** 验证表单令牌* @access protected* @param mixed $value 字段值* @...
  • Token认证在restful设计中,用户认证模式通常使用json web token,而不会使用传统的HTTP Basic认证(传入账号密码)token认证模式如下:在请求header中加入token相关推荐:《Python视频教程》Flask中的实现flask扩展...
  • 表单令牌验证

    2021-03-25 11:21:38
    # 表单令牌表单令牌可以放置重复提交,同时对机器人有一定的拦截作用,在 phpGrace 的支持下(利用 cookie),实现这样的功能是非常简单的,函数说明:## **1、setToken() 设置token**在表单中使用隐藏域设置令牌,如...
  • Access the registration token :您可以通过扩展FirebaseInstanceIdService来访问令牌的值 . 确保已将服务添加到manifest,然后在 onTokenRefresh 的上下文中调用 getToken ,并记录如下所示的值:@Overridepublic ...
  • 表单令牌验证规则支持对表单的令牌验证,首先需要在你的表单里面增加下面隐藏域:或者{:token()}然后在你的验证规则中,添加token验证规则即可,例如,如果使用的是验证器的话,可以改为:protected $rule = ['name'...
  • class Token { public function getToken($code='') { //返回的是json的数组,不是返回的字符串 (new TokenGet())->goCheck(); $ut = new UserToken($code); $token = $ut->get(); return [ 'token'=&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,955
精华内容 15,582
关键字:

token令牌验证不通过