token 订阅
在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请、登录系统使用。 展开全文
在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请、登录系统使用。
信息
学    科
信息技术(IT)
外文名
Token
词    性
名词
中文名
令牌,标记
Token令牌
(信息安全术语)Token, 令牌,代表执行某些操作的权利的对象访问令牌(Access token)表示访问控制操作主体的系统对象邀请码,在邀请系统中使用Token, Petri 网(Petri net)理论中的Token密保令牌(Security token),或者硬件令牌,例如U盾,或者叫做认证令牌或者加密令牌,一种计算机身份校验的物理设备会话令牌(Session token),交互会话中唯一身份标识符令牌化技术 (Tokenization), 取代敏感信息条目的处理过程
收起全文
精华内容
参与话题
问答
  • JWT产生和验证Token

    万次阅读 多人点赞 2019-07-31 19:15:33
    Token验证  最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强,也更安全点,非常适合用在 Web...

    #Token验证
      最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强,也更安全点,非常适合用在 Web 应用或者移动应用上。Token 的中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。
    ##传统的Token验证
      HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。
      解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。
      上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。
      ##基于 Token 的身份验证方法
      使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
    客户端使用用户名跟密码请求登录
    服务端收到请求,去验证用户名与密码
    验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
    客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
    客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
    服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
    ##JWT+HA256验证
    实施 Token 验证的方法挺多的,还有一些标准方法,比如 JWT,读作:jot ,表示:JSON Web Tokens 。JWT 标准的 Token 有三个部分:
    header
    payload
    signature
    中间用点分隔开,并且都会使用 Base64 编码,所以真正的 Token 看起来像这样:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
    

    ###Header
    header 部分主要是两部分内容,一个是 Token 的类型,另一个是使用的算法,比如下面类型就是 JWT,使用的算法是 HS256,就是SHA-256,和md5一样是不可逆的散列算法。

    {
      "typ": "JWT",
      "alg": "HS256"
    }
    

    上面的内容要用 Base64 的形式编码一下,所以就变成这样:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    

    ###Payload
    Payload 里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。下面是标准字段:
    iss:Issuer,发行者
    sub:Subject,主题
    aud:Audience,观众
    exp:Expiration time,过期时间
    nbf:Not before
    iat:Issued at,发行时间
    jti:JWT ID
    比如下面这个 Payload ,用到了 iss 发行人,还有 exp 过期时间。另外还有两个自定义的字段,一个是 name ,还有一个是 admin 。

    { 
     "iss": "ninghao.net",
     "exp": "1438955445",
     "name": "wanghao",
     "admin": true
    }
    

    使用 Base64 编码以后就变成了这个样子:

    eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ
    

    ###Signature
    JWT 的最后一部分是 Signature ,这部分内容有三个部分,先是用 Base64 编码的 header.payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。

    var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload); 
    HMACSHA256(encodedString, 'secret');
    

    处理完成以后看起来像这样:

    SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
    

    最后这个在服务端生成并且要发送给客户端的 Token 看起来像这样:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
    

    客户端收到这个 Token 以后把它存储下来,下会向服务端发送请求的时候就带着这个 Token 。服务端收到这个 Token ,然后进行验证,通过以后就会返回给客户端想要的资源。验证的过程就是
    根据传过来的token再生成一下第三部分Signature,然后两个比对一下,一致就验证通过。

    展开全文
  • token

    千次阅读 2019-07-24 17:28:40
    token 身份验证 http 请求的无状态性 JWT (jsonwebtoken) 用户登录 服务器端产生一个token (加密字符串) 发送给前端 前端将token 进行保存 前端发起数据请求的时候携带token 服务端 验证token 是否合法 如果...

    token

    • 身份验证
      http 请求的无状态性

    • JWT (jsonwebtoken)

    1. 用户登录 服务器端产生一个token (加密字符串) 发送给前端
    2. 前端将token 进行保存
    3. 前端发起数据请求的时候携带token
    4. 服务端 验证token 是否合法 如果合法继续操作 不合法终止操作
    5. token 的使用场景 无状态请求 保持用户的登录状态 第三方登录(token+auth2.0)
    • 小案例:登录页面
    1. 先打开终端,运行下面代码:
      在这里插入图片描述
    2. cd 进入token_demo,再安装依赖性文件:
      在这里插入图片描述
    3. 打造一个简单的接口文件(login.js):
      在这里插入图片描述
    4. 在app.js 中引入 路由模块 :

    在这里插入图片描述
    在这里插入图片描述
    5. 在 views 文件夹中新增一个 login.ejs 文件:
    在这里插入图片描述
    6. 启动项目( npm run start ), 测试接口:
    在这里插入图片描述
    7. 新建前端文件 token_fe,新建 index.html,样式布局。

    <body onload="loadFn()">
      <div class="container">
        <div class="row">
          <div class="form-group">
            <label for=""> 用户名 </label>
            <input type="text" class="form-control username" name="" id="" aria-describedby="emailHelpId" placeholder="">
          </div>
        </div>
        <div class="row">
          <div class="form-group">
            <label for=""> 密码 </label>
            <input type="password" class="form-control password" name="" id="" placeholder="">
          </div>
        </div>
        <div class="row">
          <button type="button" class="btn btn-primary login"> 登录 </button>
        </div>
      </div>
    </body>
    
    1. (通过go live)打开静态服务器
    2. 点击登录得到用户名和密码,发送请求:
      在这里插入图片描述
    3. 添加 onload 事件, 通过判断 cookie或是 本地存储是否有token值。如果有,那么不需要登录,自动跳转首页; 如果没有, 那么就登录。
     function loadFn() {
        var token = localStorage.getItem('token')
        if (token) {
          //有
          location.href = './index.html'
        } else {
          alert('你需要登录')
        }
      }
    
    1. 解决跨域,在 login.js 里面设置请求头:
      在这里插入图片描述
    2. 前端发请求,在data里面加上token:
      在这里插入图片描述
    3. 产生公钥和私钥,在终端分别运行以下代码:
      在这里插入图片描述
    4. 后端判断 token 有没有值,安装 jsonwebtoken(npm i jsonwebtoken -S)
    //引入文件系统
    const fs = require('fs')
    const path = require('path')
    const jwt = require('jsonwebtoken')
    
    
       const { token, username, password } = req.body
        if (token) {
          //证明有值
          res.render('login', {
            data: JSON.stringify({
              info: '登录成功',
              status: 1
            })
          })
        } else {
          // 第一次登录 或是 token失效 
          // 重新生成token  返回给前台
          // 1. 通过文件系统读取私钥
          let private_key = fs.readFileSync(path.join(__dirname, '../rsa/private_key.pem'))
          var use_token = jwt.sign(username, private_key, { algorithm: 'RS256' });
          /* 
            payload: 负载也就是数据,这里是值用户名
            private_key: 通过openSSL 生成的私钥 
            RS256: 算法
          */
          res.render('login', {
            data: JSON.stringify({
              info: '登录成功',
              status: 1,
              token: use_token
            })
          })
        }
    
    1. 存 token:
    success(res) {
            const result = JSON.parse(res)
            if (result.status === 1) {
              localStorage.setItem('token', result.token)
            }
          }
    
    

    测试!

    展开全文
  • Token

    千次阅读 2018-11-21 10:12:05
    1.Token是什么 Token是一个字符串,是一段根据特殊规则生成的唯一的、保存在缓存服务器(如Redis)中的key,这个key对应的value是用户账户数据。每个用户登录后,服务器生成一个类似Token并缓存,之后用户每次请求...

    1.Token是什么

    Token是一个字符串,是一段根据特殊规则生成的唯一的、保存在缓存服务器(如Redis)中的key,这个key对应的value是用户账户数据。每个用户登录后,服务器生成一个类似Token并缓存,之后用户每次请求中都要带上这个Token,以便实现类似于HTTP Session的会话跟踪。

    2.为什么要用Token

    随着近几年上网设备的多样化,软件项目的UI层不仅仅再是窗体、html、还有iOS、安卓app,因此基于Servlet的HTTP Session也就不再适用,因为可能没有浏览器和html页面,也没有cookie了。这种情况下、就需要Token技术来完成用户的跟踪,使得一个账户可以从html登录,也可以从手机app登其它客户端登录。

    3.Token如何生成

    每个HTTP数据包括两大主要部分,头部字段和消息体,Header是对一个HTTP数据包的描述信息,一般有多个字段和值。为了对不同客户端的Token区别对待,生成Token时需要判断客户端类型,拼接不同前缀。为了保证Token的唯一性和保密性,生成Token时还要拼接用户名+ID+日期时间+6位密码(盐,salt根据客户端信息生成);代码如下

        /**
         * 为了保证Token的唯一性和保密性,生成Token时还要拼接用户名(加密)+ID+日期时间+6位密码(盐,salt根据客户端信息生成);
         * @param agent
         * @param user
         * @return null
         */
        @Override
        public String generateToKen(String agent, ItripUser user) {
            try {//UserAgentUtil可检测客户端类型,因为要根据客户端的类型生成不同的token
                UserAgentInfo userAgentInfo = UserAgentUtil.getUasParser().parse(agent);
                StringBuilder sb = new StringBuilder();
                sb.append(tokenPrefix);
                if(userAgentInfo.getDeviceType().equals(UserAgentInfo.UNKNOWN)){//未知客户端类型
                    if(UserAgentUtil.CheckAgent(agent)){
                        sb.append("MOBILE-");//如果包含移动设备的关键字,拼接移动设备的Token前缀
                    }else {
                        sb.append("PC-");//拼接PC的Token前缀
                    }
                }else if(userAgentInfo.getDeviceType().equals("Personal computer")){
                    sb.append("PC-");//如果很明显是PC类型,拼接PC的TOken的前缀
                }else{
                    sb.append("MOBILE-");//拼接移动设备的Token前缀
                }
                sb.append(MD5.getMd5(user.getUserCode(),32) + "-");//拼接加密用户名称
                sb.append(user.getId() + "-");//拼接user id及日期
                sb.append(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "-");
                sb.append(MD5.getMd5(agent,6));//在拼接6个字符的密码
                return sb.toString();
            }catch (IOException e){
                e.printStackTrace();
            }
            return null;
        }

    4.Token登录与退出

    登录业务方法

        /**
         * 登录
         * @return 登录成功的user对象,失败返回null
         * @throws Exception
         */
        @Override
        public ItripUser login(String name, String password) throws Exception {
            ItripUser user = this.findByUsername(name);
            if(null != user&&user.getUserPassword().equals(password)){
                if(user.getActivated() != 1){
                    throw new UserLoginFailedException("用户未激活");
                }
                return user;
            }
            return null;
        }

    保存Token到Redis缓存

        /**
         * TokenServiceImpl中,保存Token到Redis缓存服务器
         * @param token
         * @param user
         */
        @Override
        public void save(String token, ItripUser user) {
            if(token.startsWith(tokenPrefix+"PC-")){
                //如果客户端是PC,Token有过期时间
                redisAPI.set(token,expire, JSON.toJSONString(user));
            }else {
                //客户端是手机,Token永不过期
                redisAPI.set(token,JSON.toJSONString(user));
            }
        }

    登录方法接收前端请求

      /**
         * 登陆方法接收前端请求
         * @param name
         * @param password
         * @param request
         * @return
         */
        @RequestMapping(value = "/dologin",method = RequestMethod.POST,produces = "application/json")
        @ResponseBody
        public Dto dologin(@RequestParam String name, @RequestParam String password,
                           HttpServletRequest request){
            if(!EmptyUtils.isEmpty(name) && !EmptyUtils.isEmpty(password)){
                ItripUser user = null;
                try {   //调用service进行登录
                    user = userService.login(name.trim(),MD5.getMd5(password.trim(),32));
                }catch (UserLoginFailedException e){//返回登录失败错误
                    return DtoUtil.returnFail(e.getMessage(),ErrorCode.AUTH_AUTHENTICATION_FAILED);
                }catch (Exception e){
                    e.printStackTrace();
                    return DtoUtil.returnFail(e.getMessage(),ErrorCode.AUTH_UNKNOWN);//返回未知错误
                }
                if(EmptyUtils.isNotEmpty(user)){//如果用户不为空,表示登录成功
                    String token = tokenService.generateToKen(
                            request.getHeader("user-agent"),user);//调用service生成Token
                    tokenService.save(token,user);//保存token到redis缓存
                    //计算token过期时间毫秒数,为系统当前事件毫秒数+7200s*1000毫秒/s,即2小时
                    long timeout = Calendar.getInstance().getTimeInMillis()+ToKenService.SESSION_TIMEOUT*1000;
                    //创建要返回的ItripTokenVO
                    ItripTokenVO tokenVO = new ItripTokenVO(token,timeout,Calendar.getInstance().getTimeInMillis());
                    //tokenVo转为JSON并响应给客户端
                    return DtoUtil.returnDataSuccess(tokenVO);
                }else{
                    return DtoUtil.returnFail("用户名密码错误",ErrorCode.AUTH_AUTHENTICATION_FAILED);
                }
            }else{
                return DtoUtil.returnFail("参数错误!检查提交的参数名是否正确。",ErrorCode.AUTH_PARAMETER_ERROR);
            }
        }

    验证token

        /**
         * 验证token是否有效:1.token在redis中是否存在;2.token是否过期
         */
        @Override
        public boolean validate(String agent, String token) {
            boolean tokenValid = false; //该变量表示token是否有效
            if(!redisAPI.exist(token)){ //如果token在redis不存在
                return tokenValid;      //返回false
            }
            try {
                String [] tokenDatails = token.split("-");//按-分割token字符串
                SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
                Date TokenGenTime = formatter.parse(tokenDatails[3]);//还原token生成时间
                long passed = Calendar.getInstance().getTimeInMillis() - TokenGenTime.getTime();//计算token已生成多久时间(毫秒数)
                if(passed > this.SESSION_TIMEOUT * 1000){//如果token已经过期
                    return tokenValid; //返回false
                }
                String agentMD5 = tokenDatails[4];
                if(MD5.getMd5(agent,6).equals(agentMD5)){   //验证token的6位密码                 
                    tokenValid = true;//如果token中的密码也一致,token有效
                }
            }catch (ParseException e){
                e.printStackTrace();
            }
            return tokenValid;
        }

    删除Token

        /**
         * 从redis删除token(key)和用户信息(value)
         * @param token
         */
        @Override
        public void delete(String token) {
            if(redisAPI.exist(token)){
                redisAPI.delete(token);
            }
        }

    退出登录方法

        @RequestMapping(value = "/logout",method = RequestMethod.GET,produces = "application/json",headers = "token")
        @ResponseBody
        public Dto logout(HttpServletRequest request){
            //从请求的Header中获取token
            String token = request.getHeader("token");
            //删除token和信息
            try {
                //验证Redis中是否有该token(且没有过期)
                if(!tokenService.validate(request.getHeader("user-agent"),token)) {
                    return DtoUtil.returnFail("token无效", ErrorCode.AUTH_TOKEN_INVALID);
                }else{
                    tokenService.delete(token);//从Redis删除
                    return DtoUtil.returnSuccess("注销成功!");
                }
            } catch (Exception e) {
                e.printStackTrace();
                return DtoUtil.returnFail("注销失败!", ErrorCode.AUTH_UNKNOWN);
            }
        }

     

    展开全文
  • 在vue中如何获取token,并将token写进header

    万次阅读 多人点赞 2018-03-15 16:12:25
    在login.vue中通过发送http请求获取token//根据api接口获取token var url = this.HOST + "/session"; this.$axios.post(url, { username: this.loginForm.username, password: this.loginForm.pa...
    需要准备的东西:Vue+axios+Vuex+Vue-router
     
    1.在login.vue中通过发送http请求获取token

     

     
    //根据api接口获取token
    var url = this.HOST + "/session";
    this.$axios.post(url, {
      username: this.loginForm.username,
      password: this.loginForm.pass
    }).then(res => {
      // console.log(res.data);
      this.$message.success('登录成功');
      let data = res.data;
      //根据store中set_token方法将token保存至localStorage/sessionStorage中,data["Authentication- 
      //Token"],获取token的value值
      this.$store.commit('set_token', data["Authentication-Token"]);
    
    if (this.$store.state.token) {
      this.$router.push('/')
    } else {
      this.$router.replace('/login');
    }
    
    }).catch(error => {
      // this.$message.error(error.status)
      this.loading = false
      this.loginBtn = "登录"
      this.$message.error('账号或密码错误');
      // console.log(error)
    })
    

     
     
    2.在store.js中对token状态进行监管
     
    import Vue from 'vue'
    import Vuex from 'vuex'
    
    
    Vue.use(Vuex)
    
    export default new Vuex.Store({
      state:{
        token:''
      },
      mutations:{
        set_token(state, token) {
            state.token = token
            sessionStorage.token = token
        },
        del_token(state) {
            state.token = ''
            sessionStorage.removeItem('token')
        }
       }
    })
    
     
    3.在router/index.js中
    import Vue from 'vue'
    import Router from 'vue-router'
    import store from './store'
    
    // 页面刷新时,重新赋值token
    if (sessionStorage.getItem('token')) {
        store.commit('set_token', sessionStorage.getItem('token'))
    }
    
    const router = new Router({
        mode: "history",
        routes
    });
    
    router.beforeEach((to, from, next) => {
      if (to.matched.some(r => r.meta.requireAuth)) {           //这里的requireAuth为路由中定义的                         
        meta:{requireAuth:true},// 意思为:该路由添加该字段,表示进入该路由需要登陆的
        if (store.state.token) {
            next();
        } else {
            next({
                path: '/login',
                query: {redirect: to.fullPath}
            })
        }
      } else {
        next();
      }
    })
    

     
     
     
     
     
    4.在main.js中定义全局默认配置:

     

    Axios.defaults.headers.common['Authentication-Token'] = store.state.token;
     
    5.在src/main.js添加拦截器,(先引入store.js)
     
    import Vue from 'vue'
    import Element from 'element-ui'
    import 'element-ui/lib/theme-chalk/index.css'
    import store from './store'
    import App from './App'
    import router from './router'
    import Axios from 'axios'
    
    // 添加请求拦截器
    Axios.interceptors.request.use(config => {
      // 在发送请求之前做些什么
      //判断是否存在token,如果存在将每个页面header都添加token
      if(store.state.token){
        config.headers.common['Authentication-Token']=store.state.token
      }
    
      return config;
    }, error => {
      // 对请求错误做些什么
      return Promise.reject(error);
    });
    
    // http response 拦截器
    Axios.interceptors.response.use(
    response => {
    
      return response;
    },
    error => {
    
    if (error.response) {
      switch (error.response.status) {
        case 401:
        this.$store.commit('del_token');
        router.replace({
          path: '/login',
          query: {redirect: router.currentRoute.fullPath}//登录成功后跳入浏览的当前页面
        })
        break
      }
    }
    return Promise.reject(error.response.data)
    });
    ------------------------------------------------------------------------------------
    ...................完成以上步骤就可以了..........................
    ------------------------------------------------------------------------------------

     

    展开全文
  • Uncaught SyntaxError: Unexpected token <; 错误完美解决

    万次阅读 多人点赞 2019-03-22 10:49:55
    今天写代码的时候发现了"Uncaught SyntaxError: Unexpected token <" <html>的js错误,而且还是html的第一行,我就蒙了,这第一行有啥问题啊,还有一个“<”符号,我以为是我的网页标签没有闭包,所以...
  • 报错原因 内含中文字符串或者中文的符号;...我在做js使用DOM元素做拼接,报了这个错误,Uncaught SyntaxError: Invalid or unexpected token var posttitle="中国人"; $api.append(abcd, " <d...
  • Go实战--golang中使用JWT(JSON Web Token)

    万次阅读 多人点赞 2019-07-18 19:33:38
    实战–go中使用cookie今天就来跟大家简单介绍一下golang中如何使用token,当然是要依赖一下github上的优秀的开源库了。首先,要搞明白一个问题,token、cookie、session的区别。token、cookie、session的区别Cookie ...
  • 看了许多小伙伴分享的刷新token和判断token是否失效的方法,个人感觉有些难懂和不够简便。现结合个人开发实践分享一下使用vue axios请求拦截的方法来刷新token和判断token是否过期、失效的方法。 刷新tokentoken...
  • 接口安全-Token

    万次阅读 2020-06-20 17:14:28
    Token登录认证 chrisghb 1 2019.06.12 21:11:16 字数 3,039 阅读 11,549 参考文章: Token 认证的来龙去脉 前后端分离使用 Token 登录解决方案 理解Cookie和Session机制 基于 Cookie/Session 的认证方案 Cookie ...
  • error: expected primary-expression before '(' token error: expected unqualified-id before numeric constant 但是反复查找也没发现什么错误,后来查资料之后才发现是宏定义INFO和另外一个头函数中的INFO冲突,...
  • TokenToken经济

    千次阅读 2018-02-10 20:45:40
    Token - 通证有三个要素 - 通证和区块链的结合 Token Economy - Token 价值的体现 - 区块链产业发展的三条不同路线 Token在社会体系中的价值 - 碳基文明向硅基文明的变迁 - 货币ICO - 新型生产关系 - 重构公司...
  • WEB安全之token令牌保证接口幂等性

    万次阅读 2020-08-16 02:05:34
    WEB安全之token令牌保证接口幂等性问题  业务要求:页面的数据只能被点击提交一次  发生原因:由于重复点击或者网络重发,或者 nginx 重发等情况会导致数据被重复提交 解决办法:采用 token 加 redis(redis ...
  • oauth2 token刷新,token续期,access_token和refresh_token实效如何设置 token认证,生成的token 过一段时间就会失效(不要故意把时间设的很长,这样不安全,token变得毫无意义!),用户需要重新登录获取token。用户...
  • node.js 实现 token 身份验证

    万次阅读 2020-01-20 14:29:48
    node + jwt 实现token身份验证 安装依赖 express-jwt npm i express-jwt 将token校验相关数据导入配置文件 // setting.js module.exports = { token: { // token密钥 signKey: 'blog_globM_token_key_$$$$'...
  • 本文主要对从用户发起获取token的请求(/oauth/token),到请求结束返回token中间经过的几个关键点进行说明。 2.认证会用到的相关请求 注:所有请求均为post请求。 获取access_token请求(/oauth/token) 请求...
  • 简单理解token机制

    万次阅读 多人点赞 2018-07-17 20:45:47
    简单理解token机制 人人都是产品经理 百家号17-12-1520:15 在简单理解cookie/session机制这篇文章中,简要阐述了cookie和session的原理。本文将要简单阐述另一个同cookie/session同样重要的技术术语:token。 ...
  • 获取Gitlab项目的Token

    万次阅读 2019-08-05 18:18:49
    获取Gitlab项目的Token 1.打开所需要Token的项目的主页进入CI/CD setting Setting -&gt; CI/CD -&gt; Genneral pioelines settings -&gt; Expand 2.开启token 笔者这里是因为已经获取了token...
  • syntax error near unexpected token `(' 脚本内容排查了很多遍都没有找到原因,执行的方式为 sh xx.sh 然后使用 source xx.sh 执行和 bash xx.sh执行都是 ok 的。 知识的了解 此时就需要了解 sh source bash 执行...
  • TokenToken验证流程

    千次阅读 2019-03-05 22:01:55
    什么是Token?为什么要使用它? Token实际就是在计算机身份验证中的令牌(临时)的意思。 当前端向后端发起数据请求的时候,后端需要对前端进行身份验证,但是我们又不想每次都输入用户名和密码,这是就需要一个标识...
  • Vue项目中实现用户登录及token验证

    万次阅读 多人点赞 2018-10-08 22:42:10
    在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下: 1、第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 2、后端收到请求,验证用户名和密码,验证成功,就给前端返回一个token 3、前端...
  • Java实现基于token认证

    万次阅读 多人点赞 2018-08-20 22:34:11
    随着互联网的不断发展,技术的迭代也...我们采用了另外一种认证方式:基于token的认证。 一、与cookie相比较的优势: 1、支持跨域访问,将token置于请求头中,而cookie是不支持跨域访问的; 2、无状态化,服务...
  • 关于token和refresh token

    万次阅读 2018-06-26 18:00:27
    最近在做公司的认证系统,总结...本质上token和cookie/session都是字符串,然而token是自带加密算法和用户信息(比如用户id),;而cookie本身不包含用户信息,它指向的是服务器上用户的 session,而由session保存用户...
  • 通过token窃取实现降权或者提权

    万次阅读 2020-12-29 17:51:38
    Delegation token(授权令牌):用于交互会话登录,例如远程桌面 Impersonation token(模拟令牌):用于非交互登录,例如dir远程主机的文c$ 当我们拿到一台主机却不知道如何提权的时候,可以看看是否有高权
  • Token添加到请求头Header中

    万次阅读 多人点赞 2018-02-22 17:38:21
     在使用JSON Web Token作为单点登录的验证媒介时,为保证安全性,建议将JWT的信息存放在HTTP的请求头中,并使用https对请求链接进行加密传输,效果如下图所示: 问题 1.由于项目是前后端分离的,不可避免的就...
  • java生成token和验证token

    千次阅读 2020-01-22 13:58:42
    java生成token和验证token 1,登录生成token public class TokenService { public String getToken(User user) { Date start = new Date(); //一小时有效时间 long currentTime = System.currentTimeMillis() +...
  • token过期时web前端如何自动刷新token

    万次阅读 2019-05-29 19:33:28
    token处理登录的web系统,一般会有两个token:access-token和refresh-token。 node.js中,一般用jsonwebtoken这个模块。 access-token,是用户输入登录的账号密码,后台去db验证然后颁发的,它一般记录在浏览器...
  • token失效

    千次阅读 2019-10-28 11:33:06
    前端请求token过期时,刷新token的处理 在前端开发中,我们经常会遇到使用tokentoken的作用是要验证用户是否处于登录状态,所以要请求一些只有登录状态才能查看的资源的时候,我们需要携带token。 一般的后端...

空空如也

1 2 3 4 5 ... 20
收藏数 172,379
精华内容 68,951
关键字:

token