精华内容
下载资源
问答
  • 如果你也有以上问题,那么本文将会带你全面解读钱包到底是干嘛的。在区块链的世界里,钱包是用来帮助大家管理链上资产和数据的一个工具软件。但是需要的注意的是,钱包它只是保存密钥和地址,我们的...
    17b186d17d84d4647f7441ed2b018b83.png

    前段时间,NEO国内dapp社区NEONEXT开发的一款的数字钱包NEOline全球公测,我做了一些介绍,然后在后台收到了诸如此类的疑问:

    钱包是啥,有什么作用?开发钱包的人会拿我的币吗?钱包是用来装币的吗?等等问题。

    如果你也有以上问题,那么本文将会带你全面解读钱包到底是干嘛的。

    在区块链的世界里,钱包是用来帮助大家管理链上资产和数据的一个工具软件。但是需要的注意的是,钱包它只是保存密钥和地址,我们的数字资产是保存链上的,并不在钱包里面,所以如果是一个去中心化的钱包,开发者是无法窃取你的资产的。

    钱包的主要功能是:随机生成私钥和钱包地址,并且接入区块链网络,接收和发送数字资产。

    7359de57104cd1a5fe9b87fe342c4e41.png

    【词解“私钥”】私钥本质上是一个长度固定的随机数,创建钱包后,输入密码就可以导出私钥,一个钱包只有一个私钥且不能改,谁拥有私钥,谁就有数字货币的控制权。所以私钥是非常关键的,一定要好好保存。但是由于私钥太长,钱包不会让用户自己设置,而是钱包自己来生成私钥。

    私钥的主要用途是:在导入钱包中,输入私钥并设置一个密码(不用输入原密码),就可以进入钱包并拥有这个钱包的使用权,就可以将钱包中的代币转移走。

    【词解“钱包地址”】钱包地址是用来接收和存储区块链资产的一个字符串。BTC系的钱包是以数字开头,ETC系的钱包地址以0开头,NEO系的钱包地址以字母A开头。

    有了钱包地址,你可以转入链上资产到对应的公链地址或者转出到同公链的其他地址。

    2bcd3794caf1e5f9827e0f14afd2a771.png

    数字钱包的整个生成主要分为以下三步:

    创建随机私钥(64位16进制字符/256比特/32字节);

    从私钥推导出公钥(128位16进制字符/512比特/64字节);

    从公钥中导出地址(40位16进制字符/160比特/20字节)。

    整个过程是单一不可逆的,由此可见如何安全方便的生成、保存、备份和恢复私钥是最为关键的。掌握了私钥,就相当于掌握了资产的所有权,这就跟有一个保险柜,里面有500万,谁有了这个保险柜的钥匙,谁就是这500万的主人。

    所以啊,保险柜可以随便给人看,但是钥匙可不能随便给人,相应的,私钥一定要保存好,地址就无所谓了。

    关于私钥、公钥、地址的具体详细解释,大家可以点击这里查看。比特村的财富守护大战......

    f543dce8273544a5e64d4b5f98ebf5f7.png

    那作为一名初入区块链世界的萌新,我们改如何选择钱包呢?

    我们日常提到的钱包有链上钱包和托管型钱包,它们的区别就是私钥的所有权问题,链上钱包的私钥是掌握在自己手里的,而托管型钱包的私钥是保管在第三方钱包运营商手里的。另外一个区别就是,链上钱包的交易是发生在区块链上的,可以直接查到;而托管型钱包的交易其实就跟我们支付宝,微信支付差不多,属于内部之间的转账

    链上型钱包,又可以根据私钥保存是否联网分为冷钱包和热钱包:

    1、热钱包(在线钱包)

    大家常用的一直联网状态下的钱包都是热钱包。比如,手机端钱包、桌面钱包,其优点是使用方便,新手易操作,交易转账的效率比较高,但是它的安全性不如冷钱包,所以这里小编建议新手可以使用热钱包。

    2、冷钱包(离线钱包)

    没有联网环境下使用过的钱包是冷钱包。比如:专业的硬件钱包,将私钥(或助记词)写在纸上,也有人利用不联网的设备制作冷钱包。虽说安全性比较高,但是它创建起来不方便,且交易也比较麻烦。但是如果你的比特币数量较大(涉及到几百万RMB以上的比特币)建议使用冷钱包,是绝对安全。

    c25f2adb9cc604f23b88d401166cda81.png

    至于我们如何选择呢?

    首先,看你的资金量大不大,资金量大的推荐使用硬件钱包,也就是冷钱包,虽然体验感较差,但安全性高。

    其次,看你投资的币种和交易频率,如果是主流币,那么选择常用钱包就好,一般钱包都支持,但是如果你投资了非主流的币,且交易量比较大,建议还是放在交易所比较好,就算交易频率不大,放在交易所开发的钱包里(例如coinbase,OKEx 等),也是非常方便的。

    最后,看你对安全上网的认识,其实除了密码保存外,区块链及其钱包都是很安全的,如果你在密码保存上注意的很好,那么存在哪里都可以。

    总结,对于新手来说,轻钱包是最合适不过的,如果是土豪,那就选择冷钱包。

    推荐钱包:NEOLine、imToken

    NEOLine:https://neoline.cn

    imToken:https://token.im

    展开全文
  • 在这里聊聊关于我对token的浅显认知,由于本人学习前端不久,如有错误,请指正。...2、token主要是用来干啥的,很多人说token是个令牌,对,确实没错,token就是令牌作用。当用户登录后进入到其他的功能页面,之

    在这里聊聊关于我对token的浅显认知,由于本人学习前端不久,如有错误,请指正。

    一、token是什么

    1、token的本质就是一串字符串,是一段从服务端生成的字符串。在你进行登录时,前端会保存你登录的数据,比如用户名,密码,邮箱,手机号等等。。。。然后通过请求发送到后端,后端对你的前端传来的数据进行加密(根据安全性,可以使用不同的加密算法进行不同程度的加密),生成字符串。

    2、token主要是用来干啥的,很多人说token是个令牌,对,确实没错,token就是令牌作用。当用户登录后进入到其他的功能页面,之后发的每个请求都会带有‘令牌’token,如果‘令牌’正确看,则可以正常请求,完成相应的功能,否则,则退出,需要重新进行登录。

    二、token的大致应用

    1、我们先了解下使用token的简单流程

    首先,我们在首次进入一个网站时,会进行注册,之后到登录页面。在登录页面,我们会进行登录操作,即为首次登录,在首次登录后,登录页面传入的信息通过请求发送到后端,后端会先验证该用户是否存在,并且密码是否正确,若用户存在,且密码正确,则根据安全性,对该用户的登录信息进行不同程度的加密,保存到token中;并将该token返回至前端。

    其次,前端接收到后台返回的token后,会将token保存到本地存储中,如cookies等,等待调用,并设置过期时间,若过期则自动删除。

    之后,在除了登录、注册等其他的功能页面中进行请求,我们会将cooKies中保存的token放到请求头里,发送到后端。

    再之后,后端取出请求头里的token,进行解密,并于在数据库中保存的用户信息进行比对(或者也许不用与数据库中的数据进行比对,直接与之前第一次在后台生成的token进行比对),若比对相等,则正常进行请求,否则,则返回登录页面,重新登录。

    最后,还有一种情况,当设置cookies的时间过期了,cookies之前保存的内容也就没了,当然也就返回登录页面,重新登录。

    三、token应用代码实际演示

    结合二,我们来进行一步步的演示,在这里我用的技术有react-hooks、node、express、MySQL、react-cookies

    1、在二的步骤之前,我们要加入一个操作,即设置一个自定的请求头set-cookie,用来在除登录、注册的其它的功能页面发送的请求头中保存token,并发送到后端。代码如下:

        res.header("Access-Control-Allow-Headers", "Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE,set-cookie");//一定要在这里面加上自定义的请求头
    
    

    最后的set-cookies,即为我们添加的自定义请求头属性,之后我们打开控制台,查看请求头会发现,set-cookie 已经添加到请求头中

    2、将前端登录信息返回到后端,在后端进行验证,并加密保存到token中;进行加密保存操作,我们需要下载一个依赖,jsonwebtoken,并进行引入

    npm install jsonwebtoken
    
    const jwt = require('jsonwebtoken')
    
     if (result.length) {   //如果在数据库中查到该用户名
                        console.log('------------start----------------');
                        var string = JSON.stringify(result);
                        var json = JSON.parse(string)[0];
                        console.log(string)
                        if (json.password == LoginData.password) {//进行验证密码
                            console.log('密码校验正确');
                            console.log(result);
                            // res.send('登录成功!')
                            
                            
                            // 用JWT 将token 将用户信息加密
                            const token = jwt.sign(LoginData,'sxy3469998737')
                            res.send({//将token返回至前端
                                a:'登录成功!',
                                b:{token}
                            }) 
                        }
    
                        else {
                            console.log('密码校验错误');
                            res.send('密码错误!')
    
    
                        } 
       }
    

    3、前端接收到后台返回的token后,我们会将他保存到cookies中(这里我们引入一个依赖react-cookies来对cookies进行相关操作)

    npm install --save react-cookie
    
    import cookie from 'react-cookies'
    
    
          //将token保存到cookies  并且   定时删除
          const deleteTimeCookie = (a) => {
                //定义cookies在一小时后自动失效
                let deleteTime = new Date(new Date().getTime() +1000*60*60)
                //userInfo为保存的cookie的名称,a为后台返回的token,
                //{ expires: deleteTime }则记时,到期自动删除,
                //{path:'/'}设置在该域名的所有路径下都可使用该cookie
                cookie.save('userInfo',a,{ expires: deleteTime },{path:'/'})
          }
    
     	 axios.post('http://localhost:8000/Signin',
                      {data1:JSON.stringify(data1)},
                      {headers:{'Content-Type' : 'application/json'}})
                            .then((res) => {Loginin(res.data.a,res.data);
                                  // cookie.save('userInfo',res.data.b.token,{path:'/'});
                                  deleteTimeCookie(res.data.b.token);//这里的res.data.b.token即为后台返回的token
                      })
                            .catch((err) => {console.log(err);})           
          }
    

    4、在除登录、注册等其他功能页面发送请求时(我这里为一个会议预订的请求),将cookie中保存的token放在自定义的请求头中,发送到后端

    var a= cookie.load('userInfo');//取出cookie中userinfo中保存的内容
    
     axios.post('http://localhost:8000/Index/Meeting',
                {data4:JSON.stringify(data4)},
                {headers:{'Content-Type' : 'application/json;charset=UTF-8',
                            'set-cookie' : a //将其给之前自定义的请求头
                         }
                          
                })
                .then((res) => {Loginexpired(res.data);})
                .catch((err) => {console.log(err);})
    

    5、后端取出请求头里的token,进行解密,并于数据库中存入的用户信息进行比对

    app.post('/Index/Meeting',
    function(req,res) {
        const MeetData = JSON.parse(req.body.data4);
        const token = req.headers['set-cookie'].pop()//取出请求头中的token,这里pop()的作用是将token值变成字符串,若不是字符串,则解析时会报错
        console.log(token);
    
    	//这里是用token的长度来判断token是否存在
    	//因为当cookie因为过期而被删除时,打印token会显示undefined,但是用undefined判断却不正确,null也不正确,所以用长度
        if(token.length > 10) {
            const a = jwt.verify(token,'sxy3469998737')//解析token,若token不为字符串,则会报错
    
            var find2 = "SELECT * FROM useinfo WHERE username = '"+a.username+"' and password = '"+a.password+"'" 
           
             
            connection.query(find2,(err,result) => {
                if (err) {   //链接失败 直接return;
                    console.log('[错误]' + err);
                    return;
                };
                if(result.length) {
                    if(MeetData !== '删除记录!') {
                        //编写查询语句
                        var find1 = "SELECT * FROM meetbook WHERE meetRoom = '"+MeetData.meetRoom+"' and meetWeek = '"+MeetData.meetWeek+"'" 
                        //插入语 句 
                        var insert = 'INSERT INTO meetbook (id,meetRoom,meetMen,meetWeek,meetStartTime,meetEndTime) VALUES (0,?,?,?,?,?)';
                        var inserInfo = [MeetData.meetRoom,MeetData.meetMen,MeetData.meetWeek,MeetData.meetStartTime,MeetData.meetEndTime];   //定义插入数据
                        //判断会议时间是否冲突
                        var timeConflict = "SELECT * FROM meetbook WHERE (meetStartTime between '"+MeetData.meetStartTime+"' and  '"+MeetData.meetEndTime+"') or (meetEndTime between '"+MeetData.meetStartTime+"' and  '"+MeetData.meetEndTime+"')  or (meetStartTime > '"+MeetData.meetStartTime+"' and meetEndTime <  '"+MeetData.meetEndTime+"') or (meetStartTime < '"+MeetData.meetStartTime+"' and meetEndTime > '"+MeetData.meetEndTime+"')  "
                     
                        //查询
                        connection.query(find1,(err,result) => {
                            if (err) {   //链接失败 直接return;
                                console.log('[错误]' + err);
                                return;
                            };
                            if(result.length) {
                                connection.query(timeConflict,(err,result) => {
                                    if (err) {   //链接失败 直接return;
                                        console.log('[判断会议室时间冲突错误错误]' + err);
                                        return;
                                    };
                                    if(result.length) {
                                        res.send("改时间段已经被预定!")
                                    }
                                    else {
                                        connection.query(insert,inserInfo,(err,result) => {
                                            if (err) {   //链接失败 直接return;
                                                console.log('[插入数据库错误]' + err);
                                                return;
                                            };
                                            console.log('------------start----------------');
                                            console.log('预订成功');
                                            console.log(result);
                                            console.log('--------------end-----------------');
                                            res.send('预订成功!')
                                        })
                                    }
                                })
                            }
                            else {
                                connection.query(insert,inserInfo,(err,result) => {
                                    if (err) {   //链接失败 直接return;
                                        console.log('[插入数据库错误]' + err);
                                        return;
                                    };
                                    console.log('------------start----------------');
                                    console.log('预订成功');
                                    console.log(result);
                                    console.log('--------------end-----------------');
                                    res.send('预订成功!')
                                })
                            }
                        })
                
                       
                        
                    }
                    else {
                            //console.log(MeetData);
                           //删除最后一条数据
                           var delete1 = "DELETE  FROM meetbook WHERE 1 ORDER BY id DESC LIMIT 1"
                           connection.query(delete1,(err,result) => {
                                if (err) {   //链接失败 直接return;
                                    console.log('[错误]' + err);
                                    return;
                                };
                                
    
                           })
                    }
                }
                else {
                    res.send("验证出现错误!")
                }
            })
        }
        else {
            res.send("登录已过期!")//向前端发送请求已过期的请求
        }
    

    6、前端接收到后端返回到的数据,若为‘登录已过期!’,则直接返回到登录页面,否则正常请求

     //登录时间过期后  自动跳转到登录页面
        const Loginexpired = (s) => {
            if (s === "验证出现错误!" || s === "登录已过期!") {
                window.location.href="http://localhost:3000"
            }
            else {
                alert(s);
            }
        }
        
     axios.post('http://localhost:8000/Index/Meeting',
                {data4:JSON.stringify(data4)},
                {headers:{'Content-Type' : 'application/json;charset=UTF-8',
                            'set-cookie' : a
                         }
                          
                })
                .then((res) => {Loginexpired(res.data);})//接收到返回的数据,并传入到函数中
                .catch((err) => {console.log(err);})
    
    
        }
    
    展开全文
  • 我这几天正好在琢磨这个东西, 找资料的时候也找到了这个问题. 顺带写一下挖的过程, 省得以后有人想问个为, 却搜半天搜不到点中文资料....这个东西(token based authentication )在5.2中出现的.那么下面开...
        

    我这几天正好在琢磨这个东西, 找资料的时候也找到了这个问题. 顺带写一下挖的过程, 省得以后有人想问个为啥, 却搜半天搜不到点中文资料. 就是怕像个人笔记,不太干.

    问题的地址:
    https://segmentfault.com/q/10...

    这个东西(token based authentication )是在5.2中出现的.那么下面开始:

    首先看 /config/auth 中的 guards 字段:

      'guards' => [
          'web' => [
              'driver' => 'session',
              'provider' => 'users',
          ],
      
          'api' => [
              'driver' => 'token',
              'provider' => 'users',
          ],
      ]

    对于上面两个东西(guards), 在路径 {project}/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php{project}/vendor/laravel/framework/src/Illuminate/Auth/TokenGuard.php 里面可以看到.

    在TokenGuard里面可以看到 user() 方法, 比如 Auth::user() 会返回一个用户, 调用的就是这个方法.

    然后看 {project}/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php, 这个里面的 guard 方法, 就是 Auth::guard('api')->check() 或者 Auth::check() 之类的代码执行时候会调用的方法. 它干了什么呢

      public function guard($name = null)
      {
          //这里就是没有提供名字,就默认用web
          $name = $name ?: $this->getDefaultDriver();
          //然后如果已经有这个guard,就返回; 没有的话,就resolve这个名字
          return isset($this->guards[$name])
                      ? $this->guards[$name]
                      : $this->guards[$name] = $this->resolve($name);
      }
    

    那么接着看 resolve 干了什么

        protected function resolve($name)
        {
            $config = $this->getConfig($name);
    
            if (is_null($config)) {
                throw new InvalidArgumentException("Auth guard [{$name}] is not defined.");
            }
    
            if (isset($this->customCreators[$config['driver']])) {
                return $this->callCustomCreator($name, $config);
            }
    
            $driverMethod = 'create'.ucfirst($config['driver']).'Driver';
    
            if (method_exists($this, $driverMethod)) {
                return $this->{$driverMethod}($name, $config);
            }
    
            throw new InvalidArgumentException("Auth guard driver [{$name}] is not defined.");
        }

    第一步的 getConfig :

        protected function getConfig($name)
        {
            return $this->app['config']["auth.guards.{$name}"];
        }
    

    去找开头提到的 config/auth 里面的配置项. 比如 api 得到的就是

          [
              'driver' => 'token',
              'provider' => 'users',
          ],

    搞到配置项以后, 在 resolve 里面继续

        $driverMethod = 'create'.ucfirst($config['driver']).'Driver';
    
        if (method_exists($this, $driverMethod)) {
            return $this->{$driverMethod}($name, $config);
        }

    如果存在相应名字的custom的driver,调用, (这个在默认的两个之前)
    如果存在自带的Driver的话, 调用相应的 createXXXXXDriver 方法. 传进去 $name$config.

    那么继续看:

    public function createTokenDriver($name, $config)
        {
            // The token guard implements a basic API token based guard implementation
            // that takes an API token field from the request and matches it to the
            // user in the database or another persistence layer where users are.
            $guard = new TokenGuard(
                $this->createUserProvider($config['provider']),
                $this->app['request']
            );
    
            $this->app->refresh('request', $guard, 'setRequest');
    
            return $guard;
        }

    注意这里用户未必一定是数据库里面搞出来的. 也可能是别的地方, 然而要看你的provider. laravel 这里的 provider 默认是 EloquentUserProvider, 那显然呵呵了, 你只能从数据库表里面找.
    实例化了一个 TokenGuard :

    public function user()
        {
            if (! is_null($this->user)) {
                return $this->user;
            }
    
            $user = null;
    
            $token = $this->getTokenForRequest();
    
            if (! empty($token)) {
                $user = $this->provider->retrieveByCredentials(
                    [$this->storageKey => $token]
                );
            }
    
            return $this->user = $user;
        }
    

    如果么有已经存在的用户,就用 getTokenForRequest 来搞一个.

        public function getTokenForRequest()
        {
            $token = $this->request->query($this->inputKey);
            
            if (empty($token)) {
                $token = $this->request->input($this->inputKey);
            }
    
            if (empty($token)) {
                $token = $this->request->bearerToken();
            }
    
            if (empty($token)) {
                $token = $this->request->getPassword();
            }
    
            return $token;
        }

    基本都是在搞request里面的 $this->inputKey 字段. 划重点.
    这个属性在构造器里面默认了: $this->inputKey = 'api_token'.
    也就是你的api request 里面, 应该是有一个

    [
      api_token => '  一堆随便什么字符串OUVjkknag89s8c987235iohiscovy89q235 '
    ]

    这样的东西

    我确实没在文档里找见.

    那么现在结论反而很简单, 如果你想用 laravel 自带的 auth:api来写API, 那么:

    1. 你的post或者任何需要验证的api请求, 都应该有一个api_token的字段.

    2. 你的用户表里面应该有一个字段api_token, 随便什么东西bcrypt一下.

    3. 然后你 routes/api 下面就可以写一堆api路由来测试了.

    之后你可以看看官网的 passport 文档之类的.

    展开全文
  • 拿来嘛的? Cookie用来跟踪浏览器用户身份的会话方式,为要用Cookie来跟踪呢?因为http协议无状态的。Cookie某些网站为了辨别用户身份而储存在用户本地终端的数据,即Cookie存放在客户端。那么Cookie...

    什么是Cookie?它是拿来干嘛的?

    Cookie是用来跟踪浏览器用户身份的会话方式,为啥要用Cookie来跟踪呢?因为http协议是无状态的。Cookie是某些网站为了辨别用户身份而储存在用户本地终端的数据,即Cookie存放在客户端。那么Cookie里到底存放了什么呢?可以用它来存放SessionID或Token。我的天,那SessionID和Token又是什么玩意?存放它俩有啥用?不急,接下来慢慢讲。

    什么是Session?它有什么用?

    Session其实也是用来跟踪浏览器用户身份的会话方式,但它和Cookie不一样,Cookie存放在客户端,而 Session数据存放在服务端,用来记录用户的状态。服务端给特定的用户创建特定的Session用来标识这个用户。因为Cookie数据是保存在客户端的,而Session数据是保存在服务器端的,所以相对而言,Session数据的安全性会更高一些。这就告诉了我们,最好不要将一些敏感的信息写入Cookie中,安全起见还可以把Cookie中的信息加密,然后到了服务端再去解密。

    具体一点,如何用特定的Session去标识特定的用户呢?通过SessionID来标识特定的用户。SessionID一般存放在服务端的内存数据库中,当用户登陆系统成功后,就会返回给客户端具有SessionID的Cookie,之后当客户端向服务端发起请求时,就可以携带上这个SessionID,这样服务端就能知道该请求的用户身份状态了。

    总的来说,通过Session进行身份验证的流程有如下5个步骤:
    1.初次登陆系统时,通过用户名和密码进行验证,这没得跑的。
    2.用户名和密码验证通过后,服务器就会为该用户创建一个特定的Session,并将Session信息存储起来。
    3.服务器把SessionID写入Cookie中,然后把这个Cookie返回给用户。
    4.当用户一直处于登陆状态时,每个后续的请求将会携带Cookie发送出去。
    5.这时服务器就能取出Cookie里存放的SessionID拿去和服务器内存中的SessionID进行比对,用来验证用户的身份,之后返回给客户端响应信息时就能携带上该用户的状态了。

    哇,Session这么强,它是不是没有缺点啊?现在是不是都是用Session去实现用户身份的跟踪啊?其实并不是,Session还是存在着自己的缺点的。毕竟人无完人,Session虽然不是人,但是也还是有缺陷的。所以接下来我们就要谈谈Token了。?别?了,从谈Token里,我们能得知Session的缺点。

    什么是Token?有Session不就完事了?要它有什么用?

    从上文的描述中,我们知道Session数据需要存储在服务端,可是当访问并发量很高时,服务端需要给大量的用户都存储Session信息,这样会给服务器造成很大的压力,也需要保证服务器的可用性。而且之前说过SessionID是存放到Cookie里的,而移动端是没有Cookie的,这样对当前很流行的移动端(就是手机等移动设备呗,人手一部)来说也不适合。

    所以Token就有它独特的魅力了,什么JWT啊,KeyCloakToken啊。这样,就不需要在服务端存储Session数据了,只需要在客户端保存服务端返回的Token数据就行了。下面来讲讲其中一种具体的Token——JWT吧。

    JWT,就是JSON Web Token。JWT由三部分组成,叫做Header、Payload和Signature。Header就是用来描述该JWT的元数据,其实就是基本信息:该Token是什么类型的啊?它用于生成签名的算法是什么啊?而Payload就是用来存放实际需要传递的数据,就是用户的状态信息呗,该用户是什么SVIP啊还是普通用户啊,都可以放在这里。而签名就是服务器依据Header、Payload和Secret(Secret就相当于一个密钥)通过某签名算法,一般是SHA256去生成,这样就保证了Token的安全性,不然岂不是人人都能伪造Token了?当然,你自己把Token泄漏出去或是被偷了另说,反正别人造是造不出了。啊,那我持有一个Token岂不是无敌了?当然不是,Token也是有过期时间的,这个可以根据需求来进行设置。那是不是得把过期时间设长一点,不然过一会我又得重新验证一次身份?但是,设得太长,万一我的Token被别人窃取了,我岂不是完犊子了?所以对于Token来说,一般还配有一个RefreshToken。实际运用中把Token的过期时间设置得短一些,把RefreshToken的过期时间设置得长一些,当Token过期时用RefreshToken去刷新Token。关于RefreshToken就简单提一提吧,感兴趣的自己去深究。

    在基于Token进行身份验证时,服务端通过Payload、Header和Secret去创建令牌Token,并把它发送给客户端,客户端可以将Token存放在Cookie或localStorage里。之后客户端发出的所有请求都会携带上这个令牌。但是把令牌放在Cookie里有一个缺点是不能跨域,所以一般都是把Token放在HTTP Header的Authorization字段中——Authorization:Bearer Token。

    同样,最后说一下Token身份验证的基本流程。
    1.当然还是用户先向服务器发送用户名和密码用于登陆系统。
    2.身份验证通过后,服务端在响应中附加带有签名的JWT,JWT的负载里包含了该用户是系统里什么角色(比如系统管理员啊、普通用户啊等等)的内容。
    3.用户以后向服务端的请求里都在Header中携带上JWT。
    4.服务端通过解析JWT,就能拿到用户的相关权限信息。然后返回和该用户对应的Response。

    最后

    认证授权这一块确实有些麻烦,之前做二次开发时,想把JWT换成Keycloak,用的SpringSecurity,不得甚解。这一部分还是很重要的,基本权限认证是每个系统必备的。

    展开全文
  •  服务器在生成表单的时候同时生成一个CSRF token,插入到...客户端都不用,照常提交表单。当表单被提交的时候,服务端检查一个表单里面的token跟自己之前记录下来的是否匹配,匹配才进行处理。 2.通过ajax发
  • 随着上周五到来的好消息,政府认可区块链技术,国内开始大力推广宣传区块链...因为也不事。 我进入区块链行业快两年了,一直以写以太坊智能合约为主,慢慢着去了解区块链更底层的技术。现在也在努力学习go语...
  • /usr/bin/python它用来嘛的?貌似没有它对脚本功能也没影响。它用来指定用什么解释器运行脚本以及解释器所在的位置。以test.py为例,脚本内容如下:def test():print ‘hello, world’if __name__ == “__...
  • 大家好,这皮爷给大家带来的最新的学习Python能干?之Django教程的进阶版。 很抱歉这篇文章更新的晚了,原因皮爷这段时间一直在日本换工作,经过一个月的煎熬,最后终于拿到了想要去的公司的offer。以后可以将...
  • python脚本中的#!...它用来嘛的?貌似没有它对脚本功能也没影响。它用来指定用什么解释器运行脚本以及解释器所在的位置。 以test.py为例,脚本内容如下: def test():  print 'hello, world' if ...
  • /usr/bin/python它用来嘛的?貌似没有它对脚本功能也没影响。它用来指定用什么解释器运行脚本以及解释器所在的位置。以hello.py为例,脚本内容如下:def test(): print 'hello, world'if __name__ == "...
  • 写这个系列的原因 今天在写课后练习时候,写到一半突然开始怀疑人生 ...我们前面学过了词法分析,吃进去的lex(词素),吐出来的是token 那我们的词法分析呢,就是拿着前面词法分析输出的Tokens,通过比对语法规则,
  • 废话不多说,懂的人自然懂这个功能能用来嘛,主要说一下实现的代码:因为使用的微信小程序自带的云开发,所以很多地方都比较简单,也不用去获取什么token啥的,直接在云函数中调用接口就可以了。获取小程序的...
  • JWT(JSON Web Token),看到Token,估计都能猜出他是干啥的了,对,就是用来登录验证的,为啥会聊到JWT呢,之前我做登录验证用的是Cookie和Session,感觉没啥问题,现在我要对我的新闻博客项目做一个版本更新,也...
  • 最近单位又有一个新Java项目。 涉及到扫码登录。...这表是干啥的呢? 就是记录一下谁扫码了。谁登录了。 User_Token表 字段如下: 1、uuid : 用于确保唯一性 2、userId : 谁登录的 3、loginTim...
  • 如果证券化,或者加强监管,那数字代币的优势荡然无存,比特币为值钱,不言而喻,主要就是全球付款方便无人追踪,大家都认可,具体用途嘛,咱暂且不说也不过问,大家都懂得。那如果优势没了...
  • 其实吧,Oauth可能大家也接触过,...让用户直接用QQ就可以登陆,其实说的直白点,我写的应用,事没,就感觉让客户登陆了一下,而且我其实也拿不到用户的账号,只是获取了客户的信息,还有一个授权的token。对于我的
  • 会话技术

    2019-12-05 19:33:30
    干啥的 辅助服务器识别用户(客户端) 怎么实现 主要有三种 内置实现 Cookie Session 自定义 Token 啥时候用 只要需要识别用户 想要用户历史信息 服务器为什么不能识别客户端? 服务器面向海量...
  • AST是啥? Abstract Syntax Tree(AST)-抽象语法树. 那AST二叉树吗? 大部分示例都画为二叉树. 但是树其实就是嵌套的list,为一个节点不能有多个儿子.不过在我们组建AST过程中很少用到多叉树. 然后parser如何工作呢?...
  • 前端不行,后端不会,干啥啥不行要钱第一名,是不是很多同学都可以对上号? 现在的公司招聘太变态,技术更新又太快,没有足够工作年限,又没有足够项目经验!这就是很多求职同学面临的硬伤啊,小编也不例外啊!又不...
  • 有问题请留言 各位同学可以在issues中提问,无论实际项目中遇到的问题,或者技术问题都可以, 大家一起解决:100: 。...你get了无数技能,为却一事无成.md 专业程序员的七个特质 提高程序员编程能力的有效方法
  • JWT :JWT(JSON Web Token一种身份认证的方式,JWT 本质上就一段签名的 JSON 格式的数据。由于它带有签名的,因此接收者便可以验证它的真实性。相关阅读: JWT 优缺点分析以及常见问题解决方案 适合初学者...
  • JWT :JWT(JSON Web Token一种身份认证的方式,JWT 本质上就一段签名的 JSON 格式的数据。由于它带有签名的,因此接收者便可以验证它的真实性。相关阅读: JWT 优缺点分析以及常见问题解决方案 适合初学者...
  • JWT :JWT(JSON Web Token一种身份认证的方式,JWT 本质上就一段签名的 JSON 格式的数据。由于它带有签名的,因此接收者便可以验证它的真实性。相关阅读: JWT 优缺点分析以及常见问题解决方案 适合初学者...
  • 深入浅出 - Redux

    2021-01-08 14:31:52
    以及它是干什么的,这里我就讲讲如何创建Store,以及如何使用Store的方法。 创建Store非常简单。createStore 有两个参数,Reducer 和 initialState。 <pre><code> javascript let store = ...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

token是干啥的