精华内容
下载资源
问答
  • JWT产生和验证Token

    万次阅读 多人点赞 2019-07-31 19:15:33
    Token验证  最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,...Token中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。 传统的Token验证 ...

    #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,然后两个比对一下,一致就验证通过。

    展开全文
  • PHP使用Token

    千次阅读 2017-02-06 15:17:51
    什么是TokenToken 中文翻译为令牌,一般用来防止表单重复提交,csrf跨站请求伪造。 保证web安全。 Token原理: 服务端会先创建一个Token,保存在session中,客户端中添加<input type="hidden" name="token" value=...

    什么是Token

    Token 中文翻译为令牌,一般用来防止表单重复提交,csrf跨站请求伪造。 保证web安全。
    Token原理: 服务端会先创建一个Token,保存在session中,客户端中添加<input type="hidden" name="token" value="<?php $_SESSION['token']?>"/>,提交表单时,服务端会获取token的值,如果值和session设置的值不同,表明重复提交或者为csrf攻击。

    例子

    <?php
    session_start();
    function setToken() {
        $_SESSION['token'] = md5(microtime());
    }
    
    function validToken() {
        $return = ($_REQUEST['token'] === $_SESSION['token'] ? true : false);
        setToken();
        return $return;
    }
    
    if(!isset($_SESSION['token']) || $_SESSION['token'] == '') {
        setToken();
    }
    
    if(isset($_POST['text'])) {
        if(validToken()) {
            echo time();
        } else {
            echo 'error';
        }
    }
    ?>
    
    <html>
    <body>
        <form action="" method="post">
            <input type="hidden" name="token" value="<?php $_SESSION['token']?>"/>
            <input type="text" name="text" value="val"/>
            <input type="submit" value="submit"/>
        </form>
    </body>
    </html>
    展开全文
  • 这两个c语言中的基本概念,翻译成什么中文比较好?
  • Token

    2018-11-18 17:11:40
    最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如&nbsp;Facebook,Twitter,Google+,...Token中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些...

    最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强,也更安全点,非常适合用在 Web 应用或者移动应用上。Token 的中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。

    文章先介绍了一下传统身份验证与基于 JWT 身份验证的方法,再理解一下 JWT 的 Token 的组成部分(头部,数据,签名),最后我们会在一个 Node.js 项目上实施签发与验证 JWT 的功能。练习的视频版本可以参考《JWT:JSON Web Token》这个免费的课程,项目代码在 Github 上可以找到。

    宁皓网有一系列的基于 Token 身份验证的课程,比如在 Node.js 项目里,或者 WordPress 网站上实现这种身份验证的方法,我们还介绍了在小程序里面使用了这种基于 Token 的方法来验证小程序用户的身份。

    订阅宁皓网以后,就可以在线学习所有这些基于 Token 验证身份的相关课程。

    传统身份验证的方法

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

    解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

    上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。

    基于 Token 的身份验证方法

    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

    1. 客户端使用用户名跟密码请求登录
    2. 服务端收到请求,去验证用户名与密码
    3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
    4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
    5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
    6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

    JWT

    实施 Token 验证的方法挺多的,还有一些标准方法,比如 JWT,读作:jot ,表示:JSON Web Tokens 。JWT 标准的 Token 有三个部分:

    • header(头部)
    • payload(数据)
    • signature(签名)

    中间用点分隔开,并且都会使用 Base64 编码,所以真正的 Token 看起来像这样:

    eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

    Header

    每个 JWT token 里面都有一个 header,也就是头部数据。里面包含了使用的算法,这个 JWT 是不是带签名的或者加密的。主要就是说明一下怎么处理这个 JWT token 。

    头部里包含的东西可能会根据 JWT 的类型有所变化,比如一个加密的 JWT 里面要包含使用的加密的算法。唯一在头部里面要包含的是 alg 这个属性,如果是加密的 JWT,这个属性的值就是使用的签名或者解密用的算法。如果是未加密的 JWT,这个属性的值要设置成 none

    示例:

    {
      "alg": "HS256"
    }

    意思是这个 JWT 用的算法是 HS256。上面的内容得用 base64url 的形式编码一下,所以就变成这样:

    eyJhbGciOiJIUzI1NiJ9

    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
    }

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

    eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ

    Signature

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

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

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

    SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

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

    eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

    客户端收到这个 Token 以后把它存储下来,下回向服务端发送请求的时候就带着这个 Token 。服务端收到这个 Token ,然后进行验证,通过以后就会返回给客户端想要的资源。

    签发与验证 JWT

    在应用里实施使用基于 JWT 这种 Token 的身份验证方法,你可以先去找一个签发与验证 JWT 的功能包。无论你的后端应用使用的是什么样的程序语言,系统,或者框架,你应该都可以找到提供类似功能的包。

    下面我们在一个 Node.js 项目里,用最简单的方式来演示一下签发还有验证 JWT 的方法。练习有个视频版本,你可以参考《 JWT:JSON Web Token 》这个免费的视频课程。

    项目代码https://github.com/ninghao/jwt-demo

    准备项目

    准备一个简单的 Node.js 项目:

    cd ~/desktop
    mkdir jwt-demo
    cd jwt-demo
    npm init -y

    安装签发与验证 JWT 的功能包,我用的叫 jsonwebtoken,在项目里安装一下这个包:

    npm install jsonwebtoken --save

    签发 JWT

    在项目里随便添加一个 .js 文件,比如 index.js,在文件里添加下面这些代码:

    const jwt = require('jsonwebtoken')
    

    // Token 数据
    const payload = {
    name: ‘wanghao’,
    admin: true
    }

    // 密钥
    const secret = ‘ILOVENINGHAO’

    // 签发 Token
    const token = jwt.sign(payload, secret, { expiresIn: ‘1day’ })

    // 输出签发的 Token
    console.log(token)

    非常简单,就是用了刚刚为项目安装的 jsonwebtoken 里面提供的 jwt.sign 功能,去签发一个 token。这个 sign 方法需要三个参数:

    1. playload:签发的 token 里面要包含的一些数据。
    2. secret:签发 token 用的密钥,在验证 token 的时候同样需要用到这个密钥。
    3. options:一些其它的选项。

    在命令行下面,用 node 命令,执行一下项目里的 index.js 这个文件(node index.js),会输出应用签发的 token

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlLCJpYXQiOjE1MjkwMzM5MDYsImV4cCI6MTUyOTEyMDMwNn0.DctA2QlUCrM6wLWkIO78wBVN0NLpjoIq4T5B_2WJ-PU

    上面的 Token 内容并没有加密,所以如果用一些 JWT 解码功能,可以看到 Token 里面包含的内容,内容由三个部分组成,像这样:

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

    // payload
    {
    “admin”: true,
    “iat”: 1529033906,
    “name”: “wanghao”,
    “exp”: 1529120306
    }

    // signature
    DctA2QlUCrM6wLWkIO78wBVN0NLpjoIq4T5B_2WJ-PU

    假设用户通过了某种身份验证,你就可以使用上面的签发 Token 的功能为用户签发一个 Token。一般在客户端那里会把它保存在 Cookie 或 LocalStorage 里面。

    用户下次向我们的应用请求受保护的资源的时候,可以在请求里带着我们给它签发的这个 Token,后端应用收到请求,检查签名,如果验证通过确定这个 Token 是我们自己签发的,那就可以为用户响应回他需要的资源。

    验证 JWT

    验证 JWT 的用效性,确定一下用户的 JWT 是我们自己签发的,首先要得到用户的这个 JWT Token,然后用 jwt.verify 这个方法去做一下验证。这个方法是 Node.js 的 jsonwebtoken 这个包里提供的,在其它的应用框架或者系统里,你可能会找到类似的方法来验证 JWT。

    打开项目的 index.js 文件,里面添加几行代码:

    // 验证 Token
    jwt.verify(token, 'bad secret', (error, decoded) => {
      if (error) {
        console.log(error.message)
        return
      }
      console.log(decoded)
    })

    把要验证的 Token 数据,还有签发这个 Token 的时候用的那个密钥告诉 verify 这个方法,在一个回调里面有两个参数,error 表示错误,decoded 是解码之后的 Token 数据。

    执行:

    node ~/desktop/jwt-demo/index.js

    输出:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlLCJpYXQiOjE1MjkwMzQ3MzMsImV4cCI6MTUyOTEyMTEzM30.swXojmu7VimFu3BoIgAxxpmm2J05dvD0HT3yu10vuqU
    

    invalid signature

    注意输出了一个 invalid signature ,表示 Token 里的签名不对,这是因为我们组长 verify 方法提供的密钥并不是签发 Token 的时候用的那个密钥。这样修改一下:

    jwt.verify(token, secret, (error, decoded) => { ...

    再次运行,会输出类似的数据:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlLCJpYXQiOjE1MjkwMzUzODYsImV4cCI6MTUyOTEyMTc4Nn0.mkNrt4TfcfmP22xd3C_GQn8qnUmlB39dKT9SpIBTBGI
    
    { name: 'wanghao', admin: true, iat: 1529035386, exp: 1529121786 }

    RS256 算法

    默认签发还有验证 Token 的时候用的是 HS256 算法,这种算法需要一个密钥(密码)。我们还可以使用 RS256 算法签发与验证 JWT。这种方法可以让我们分离开签发与验证,签发时需要用一个密钥,验证时使用公钥,也就是有公钥的地方只能做验证,但不能签发 JWT。

    在项目下面创建一个新的目录,里面可以存储即将生成的密钥与公钥文件。

    cd ~/desktop/jwt-demo
    mkdir config
    cd config

    密钥

    先生成一个密钥文件:

    ssh-keygen -t rsa -b 2048 -f private.key

    公钥

    基于上面生成的密钥,再去创建一个对应的公钥:

    openssl rsa -in private.key -pubout -outform PEM -out public.key

    签发 JWT(RS256 算法)

    用 RS256 算法签发 JWT 的时候,需要从文件系统上读取创建的密钥文件里的内容。

    const fs = require('fs')
    

    // 获取签发 JWT 时需要用的密钥
    const privateKey = fs.readFileSync(’./config/private.key’)

    签发仍然使用 jwt.sign 方法,只不过在选项参数里特别说明一下使用的算法是 RS256:

    // 签发 Token
    const tokenRS256 = jwt.sign(payload, privateKey, { algorithm: 'RS256' })
    
    // 输出签发的 Token
    console.log('RS256 算法:', tokenRS256)

    验证 JWT(RS256 算法)

    验证使用 RS256 算法签发的 JWT,需要在文件系统上读取公钥文件里的内容。然后用 jwtverify 方法去做验证。

    // 获取验证 JWT 时需要用的公钥
    const publicKey = fs.readFileSync('./config/public.key')
    

    // 验证 Token
    jwt.verify(tokenRS256, publicKey, (error, decoded) => {
    if (error) {
    console.log(error.message)
    return
    }
    console.log(decoded)
    })

    相关课程

    1. JWT:JSON Web Token
    2. Node.js:基于 Token 的身份验证
    3. WordPress 开发:身份验证(JWT)》
    4. 微信小程序:应用后台__身份验证 #3
    JWT Node.js
    展开全文
  • token

    2018-11-15 23:06:55
    Token中文有人翻译成 “令牌”,意思就是,你拿着这个令牌,才能过一些关卡.一般用来做登录校验或则身份验证. 二.传统的身份验证(session的方法) HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。...

    一.什么是token

    Token 的中文有人翻译成 “令牌”,意思就是,你拿着这个令牌,才能过一些关卡.一般用来做登录校验或则身份验证.

    二.传统的身份验证(session的方法)

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

    解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

    上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。
    在这里插入图片描述

    三 基于 Token 的身份验证方法

    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

    在这里插入图片描述

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

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

    3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端

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

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

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

    三. token与session的区别

    3.1 为什么要用token

    首先,session的存储是需要空间的,其次,session的传递一般都是通过cookie来传递的,或者url重写的方式;而token在服务器是可以不需要存储用户的信息的,而token的传递方式也不限于cookie传递,当然,token也是可以保存起来的;

    3.2 怎么生成token

    浏览器第一次访问服务器,根据传过来的唯一标识userId,服务端会通过一些算法,如常用的HMAC-SHA256算法,然后加一个密钥,生成一个token,然后通过BASE64编码一下之后将这个token发送给客户端;客户端将token保存起来,下次请求时,带着token,服务器收到请求后,然后会用相同的算法和密钥去验证token,如果通过,执行业务操作,不通过,返回不通过信息;

    3.3 两者的区别

    token和session其实都是为了身份验证,session一般翻译为会话,而token更多的时候是翻译为令牌;
    session服务器会保存一份,可能保存到缓存,文件,数据库;同样,session和token都是有过期时间一说,都需要去管理过期时间;
    其实token与session的问题是一种时间与空间的博弈问题,session是空间换时间,而token是时间换空间。两者的选择要看具体情况而定。

    虽然确实都是“客户端记录,每次访问携带”,但 token 很容易设计为自包含的,也就是说,后端不需要记录什么东西,每次一个无状态请求,每次解密验证,每次当场得出合法 /非法的结论。这一切判断依据,除了固化在 CS 两端的一些逻辑之外,整个信息是自包含的。这才是真正的无状态。
    而 sessionid ,一般都是一段随机字符串,需要到后端去检索 id 的有效性。万一服务器重启导致内存里的 session 没了呢?万一 redis 服务器挂了呢?

    方案 A :我发给你一张身份证,但只是一张写着身份证号码的纸片。你每次来办事,我去后台查一下你的 id 是不是有效。
    方案 B :我发给你一张加密的身份证,以后你只要出示这张卡片,我就知道你一定是自己人。
    就这么个差别。

    四 案例实现

    前端实现的时候用axios来拦截到所有请求与响应来进行操作

    4.1 axios拦截器的使用

    拦截所有请求实现转菊花的动作

    //拦截所有的请求
    axios.interceptors.request.use(config => {
        // 在发送请求之前,做一个转动菊花的图
        alert("正在发送请求")
        return config;
      }, error => {
        // 对请求错误做些什么
        return Promise.reject(error);
    })
    

    拦截到所有响应:

    // 添加响应拦截器
    axios.interceptors.response.use(function (response) {
        // 对响应数据做点什么
        return response;
      }, function (error) {
        // 对响应错误做点什么
        return Promise.reject(error);
      });
    

    关于axios学习的链接: https://www.kancloud.cn/yunye/axios/234845

    4.2 axios结合token的技术实现

    import axios from 'axios' // axios引用
    import store from '../../store' // store引用
    const serivce = axios.create({ // 创建服务
      baseURL: 'http://test.api.rujiaowang.net', // 基础路径
      timeout: 5000 // 请求延时
    })
    serivce.interceptors.request.use( // 请求拦截
      config => {
        if (store.getters.userToken) {
          config.headers['X-Token'] = store.getters.userToken
          config.headers['User-Type'] = store.getters.userType ? store.getters.userType : '' // 请求头中存放用户信息
          config.onUploadProgress = (progressEvent) => {
            var complete = (progressEvent.loaded / progressEvent.total * 100 | 0) + '%'
            store.dispatch('setupLoadPercent', complete)
          }
        }
        return config
      },
      error => {
        return Promise.reject(error)
      }
    )
    serivce.interceptors.response.use( // 回复拦截,主要针对部分回掉数据状态码进行处理
      response => {
        return response
      },
      error => {
        return Promise.reject(error)
      }
    )
    export default serivce
    

    Vue刷新token,判断token是否过期、失效,进行登录判断跟token值存储

    刷新token和token是否过期的操作都是由后端实现,前端只负责根据code的不同状态来做不同的操作:可以跟后端讨论不同的状态对应不同的情况来进行处理

    具体实现:

    /**
    * 全局变量 和 设置 、配置等。。。
    */
     
    import axios from 'axios' // 引入axios
     
    import Storage from '@/assets/js/util/storage.js' // storage工具类,简单的封装
     
     
     
    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
     
     
     
    /* 请求拦截器 */
     
    axios.interceptors.request.use(function (config) { // 每次请求时会从localStorage中获取token
     
        let token = Storage.localGet('token')
     
        if (token) {
        
            token = 'bearer' + ' ' + token.replace(/'|"/g, '') // 把token加入到默认请求参数中
     
            config.headers.common['Authorization'] = token
     
        }
     
        return config
     
    }, function (error) {
     
        return Promise.reject(error)
     
    })
     
    /* 响应拦截器 */
     
    axios.interceptors.response.use(function (response) { // ①10010 token过期(30天) ②10011 token无效
     
    if (response.data.code === 10010 || response.data.code === 10011) {
     
        Storage.localRemove('token') // 删除已经失效或过期的token(不删除也可以,因为登录后覆盖)
     
        router.replace({
     
            path: '/login' // 到登录页重新获取token
     
        })
     
    } else if (response.data.token) { // 判断token是否存在,如果存在说明需要更新token
     
        Storage.localSet('token', response.data.token) // 覆盖原来的token(默认一天刷新一次)
     
    }
     
        return response
     
    }, function (error) {
     
        return Promise.reject(error)
     
    })
    
    展开全文
  • CTN NO是什么意思中文?根据加纳GHANA法令,自2018年3月1日起,所有发货至加纳特马、阿克拉、库马西、塔克拉底、塔马利的货物都...CTN是英语CARGO TRACKING NOTE的简称,中文翻译为货物跟踪单或货物跟踪号;ECTN是英...
  • Token验证介绍

    千次阅读 2017-04-21 19:23:49
    什么是TokenToken中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。Token是一个用户自定义的任意字符串。在成功提交了开发者自定义的这个字符串之后,Token的值会保存到服务器...
  • 基于Token的身份验证——JSON Web Token Token的维基百科 token的维基百科,可以了解Token的发展和定义。 ...Token的广泛应用 ...现如今的很多大型网站,比如Facebook、Twitter、Google...Token的在中文翻译中有”令...
  • token 小记

    2016-10-26 12:10:00
    最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如...Token中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。 传统身份验证的方法 HTTP 是一种没...
  • 什么是token

    2018-10-27 11:05:16
    那有没有想过,token 或者说令牌到底是什么东西,有什么作用,为什么 token中文翻译是“令牌”?   其实这个问题也困扰了我很长的时间。长久以来我都是从 token 的形式上猜测他应该是类似密码一样的东西...
  • Arcsight FlecConnector的日志解析开发指南,包括FlecConnector的安装、配置文件、高级特性、映射文件、Token等内容
  • 通过抓包可以看到谷歌的翻译接口需要生成一个token,此功能需要通过js实现。我们可以使用PyExecJs这个库来实现在python中执行js脚本的功能。然后直接通过requests调用谷歌翻译接口就行了。代码如下:import ...
  • 最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如Facebook...Token中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。 传统身份验证的方法 HTTP ...
  • Token的概念

    万次阅读 2018-01-23 14:45:38
     最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份...Token中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这
  • 通过抓包可以看到谷歌的翻译接口需要生成一个token,此功能需要通过js实现。我们可以使用PyExecJs这个库来实现在python中执行js脚本的功能。然后直接通过requests调用谷歌翻译接口就行了。代码如下:import ...
  • 译者声明:本文内容为翻译ZILLIQA英文版白皮书,个人阐述均有注明。个人水平有限,如有错误,请不吝指正,谢谢! 第八部分 激励层 A. 代币(token)供应 ZILLIQA网络限量供应210亿个ZIL。最小单位为一个ZIL的...
  • jwt的TOKEN

    2017-12-05 15:19:16
    最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,...Token中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。 传统身份验证的方法 HTTP 是一种没有状态的
  • 基于 Token 的身份验证和安全问题

    万次阅读 2017-02-13 16:15:41
    1 前言最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,...Token中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。2 基于 Token 的身份验证方法使用基于
  • JWT和验证Token

    2020-09-04 11:51:45
    Token中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。 传统的token验证   HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,...
  • 一个查询页面突然出现如下这个错误:Uncaught SyntaxError: Invalid or unexpected token翻译中文是:捕获的查询无效或意外的标记。这是个啥?仔细查询代码逻辑完全没问题,一脸懵逼,都不知道发生了什么。既然...
  • 基于 Token 的身份验证:JSON Web Token(附:Node.js 项目) 最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,...Token中文有人翻译成 “令牌”,我觉得挺好,意思...
  • token的理解

    2018-11-06 00:01:26
    Token中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡   传统身份验证 HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端...
  • web安全之token

    2018-05-25 18:40:00
    最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如...Token中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。 传统身份验证的方法 HTTP 是一种没有...
  • Token的简单解释

    千次阅读 2017-10-27 09:09:36
    最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如...Token中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。 传统身份验证的方法 HTTP 是一种没

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 187
精华内容 74
关键字:

token中文翻译