精华内容
下载资源
问答
  • 主要介绍了PHP token验证生成原理,结合实例形式分析了php的token验证原理与使用技巧,需要的朋友可以参考下
  • PyJWT生成token

    2020-08-03 19:34:56
    使用Pyjwt在django中创建和认证token,用于在移动端来认证和用户,本文通过自己编写模型来实现根据用户来生成token,在请求头中添加Authentication来进行认证,保持登录状态。可以直接使用,编写过程可以查看本人...
  • JWT Token生成及验证

    2020-07-16 17:07:57
    JWT Token生成及验证:JSON WEB TOKEN,简单谈谈TOKEN的使用及在C#中的实现
  • 此资源是针对“Token生成规则以及工具”这篇文章的相关代码文章地址:https://blog.csdn.net/kai_1215/article/details/78477146
  • PHP 在做APP后台时用到的TOKEN验证功能,现已封装成类,使用很方便,有完整的生成与验证机制,可控制TOKEN过期时间,生成端经过加密处理生成TOKEN字符,验证端解密后再验证TOKEN真正的TOKEN也是经过加密验证的,二...
  • 七牛云token生成器.exe

    2019-12-02 19:40:26
    可以根据AccessKey,SecretKey,Bucket,生成七牛云OSS的token,用于表单上传图片的post参数,还可以指定过期时间哦~~~
  • 前端页面RSA加密生成token代码,并保存token到本地,在进行其他请求的时候可以把token作为参数带过去
  • token是由服务器生成的字符串,用作客户端发出请求的token。当第一个会话启动时,服务器生成一个token并将其返回给客户机。将来,客户只需要使用这个token来请求数据,而不需要重新输入用户名和密码。基于token的...

    什么是token?token是由服务器生成的字符串,用作客户端发出请求的token。当第一个会话启动时,服务器生成一个token并将其返回给客户机。将来,客户只需要使用这个token来请求数据,而不需要重新输入用户名和密码。

    基于token的身份验证

    基于token的身份验证方法不需要将用户的登录日志存储在服务器上。过程如下:

    客户端将使用用户名和密码请求登录,并要求服务器确认用户名和密码。

    如果检查成功,服务器将发出一个token并将其作为客户端token发送。在接收到token之后,客户机可以将token存储在cookie或本地存储中。每当客户端从服务器请求资源时,客户端必须向服务器发送token。

    服务器接收请求,然后验证在客户端请求中找到的token。如果验证成功,请求的数据将返回给客户。当应用程序登录时,加密的用户名和密码将发送到服务器。检查用户名和密码。例如,如果以任何方式成功,将随机生成一个32位字符串作为token,存储在服务器上,然后返回到应用程序。请求后,在token中,服务器检查token,成功返回所需结果,返回错误消息失败,可以重新登录。服务器上的token设置为过期,并且在每次应用程序请求时都会进行验证。

    象征性优势

    1。无状态、可扩展

    存储在客户端的token是无状态的和可扩展的。如果不存储这种无状态和会话信息,负载均衡器就可以将用户信息从一个服务传输到另一个服务。在会话中存储经过身份验证的用户信息时,用户必须为每个请求向经过身份验证的服务器发送身份验证信息(称为会话关联)。大量用户可能导致拥塞。但是,不要担心使用token来解决这些问题,因为token包含您的凭据。

    2。安全

    通过在请求中发送token而不是cookie,可以避免CSRF(跨站点请求伪造)。即使客户端使用cookie来存储token,cookie也只是一种存储机制,而不是用于身份验证。减少会话,而不在会话中存储信息。token是紧急的,因此用户需要在一段时间后再次进行身份验证。无需等待token自动过期。token具有恢复操作。token终止可以使具有相同身份验证的特定token或token集失效。

    三。可扩展性

    token可用于创建与其他程序共享权限的程序。例如,您可以将非官方社交账户链接到自己的大账户(Fackbook或Twitter)。

    通过此服务登录Twitter(使用此进程缓冲区)时,可以附加此缓冲区并将其发布到Twitter流。此token允许您为第三方应用程序提供可选权限。

    4。跨平台和跨域

    在提前讨论CORS(域之间的资源交换)和扩展应用程序和服务时,涉及到多个设备和应用程序。

    此标准基于这样一个事实,即您可以在创建token时配置一些选项。稍后我们将记录内容,但标准用法反映在JSONWebtoken中。您可以将最近使用的应用程序和文档用作JSONWebtokens。它是一种兼容的语言。这意味着您可以真正地转换它以供以后使用,并成为一种身份验证机制。

    象征性原则

    base64加密1。有效载荷和标题信息、加密文本和加密表单标题文本。

    点形成的两个密文连接到加密密钥服务器,生成hs256的签名。

    三。文本后面的前两个密码是常规签名。最后一个表单返回到服务器token,请注意:

    (1)此用户token到服务器(分为三部分,第一部分是密文加密负载、签名)。服务器将解密解析为第一部分(第一个密文)和base64。你可以知道签名算法。这是hs256的解决方案。

    (2)服务器hs256操作执行签名签名,签名签名是在使用原始密钥将签名返回到密文(加密的标题文本+'+付费密文)之后获得的。如果token合法,则差异意味着原始文本已被修改。

    (3)第2部分(密码有效负载)由base64确定,以确定解密的到期日期以及客户端是否知道授权期间的有效负载。如果token过期,则将此值与当前时间进行比较。

    展开全文
  • 什么是tokentoken是怎么生成

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

    https://www.cnblogs.com/lufeiludaima/p/pz20190203.html

    什么是token

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

      基于 Token 的身份验证

    1. 使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。流程是这样的:
    2. 客户端使用用户名跟密码请求登录
    3. 服务端收到请求,去验证用户名与密码
    4. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
    5. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
    6. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
    7. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
    8. APP登录的时候发送加密的用户名和密码到服务器,服务器验证用户名和密码,如果成功,以某种方式比如随机生成32位的字符串作为token,存储到服务器中,并返回token到APP,以后APP请求时,
    9. 凡是需要验证的地方都要带上该token,然后服务器端验证token,成功返回所需要的结果,失败返回错误信息,让他重新登录。其中服务器上token设置一个有效期,每次APP请求的时候都验证token和有效期。

    token的优势

      1.无状态、可扩展

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

      2.安全性

      请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。token是有时效的,一段时间之后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回的操作,通过token revocataion可以使一个特定的token或是一组有相同认证的token无效。

      3.可扩展性

      Tokens能够创建与其它程序共享权限的程序。例如,能将一个随便的社交帐号和自己的大号(Fackbook或是Twitter)联系起来。当通过服务登录Twitter(我们将这个过程Buffer)时,我们可以将这些Buffer附到Twitter的数据流上(we are allowing Buffer to post to our Twitter stream)。使用tokens时,可以提供可选的权限给第三方应用程序。当用户想让另一个应用程序访问它们的数据,我们可以通过建立自己的API,得出特殊权限的tokens。

      4.多平台跨域

      我们提前先来谈论一下CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。Having our API just serve data, we can also make the design choice to serve assets from a CDN. This eliminates the issues that CORS brings up after we set a quick header configuration for our application.只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。Access-Control-Allow-Origin: *

      5.基于标准

      创建token的时候,你可以设定一些选项。我们在后续的文章中会进行更加详尽的描述,但是标准的用法会在JSON Web Tokens体现。最近的程序和文档是供给JSON Web Tokens的。它支持众多的语言。这意味在未来的使用中你可以真正的转换你的认证机制。

    token原理

    展开全文
  • 主要介绍了github 生成token的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
  • Android token生成和上传(七牛),主要是上传token生成部分。七牛里面没有Android部分的实例代码,写完之后共享给大家。避免再走弯路。
  • 什么是token及怎样生成token

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

    什么是token

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

      基于 Token 的身份验证

    1. 使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。流程是这样的:
    2. 客户端使用用户名跟密码请求登录
    3. 服务端收到请求,去验证用户名与密码
    4. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
    5. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
    6. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
    7. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
    8. APP登录的时候发送加密的用户名和密码到服务器,服务器验证用户名和密码,如果成功,以某种方式比如随机生成32位的字符串作为token,存储到服务器中,并返回token到APP,以后APP请求时,
    9. 凡是需要验证的地方都要带上该token,然后服务器端验证token,成功返回所需要的结果,失败返回错误信息,让他重新登录。其中服务器上token设置一个有效期,每次APP请求的时候都验证token和有效期。

    token的优势

      1.无状态、可扩展

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

      2.安全性

      请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。token是有时效的,一段时间之后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回的操作,通过token revocataion可以使一个特定的token或是一组有相同认证的token无效。

      3.可扩展性

      Tokens能够创建与其它程序共享权限的程序。例如,能将一个随便的社交帐号和自己的大号(Fackbook或是Twitter)联系起来。当通过服务登录Twitter(我们将这个过程Buffer)时,我们可以将这些Buffer附到Twitter的数据流上(we are allowing Buffer to post to our Twitter stream)。使用tokens时,可以提供可选的权限给第三方应用程序。当用户想让另一个应用程序访问它们的数据,我们可以通过建立自己的API,得出特殊权限的tokens。

      4.多平台跨域

      我们提前先来谈论一下CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。Having our API just serve data, we can also make the design choice to serve assets from a CDN. This eliminates the issues that CORS brings up after we set a quick header configuration for our application.只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。Access-Control-Allow-Origin: *

      5.基于标准

      创建token的时候,你可以设定一些选项。我们在后续的文章中会进行更加详尽的描述,但是标准的用法会在JSON Web Tokens体现。最近的程序和文档是供给JSON Web Tokens的。它支持众多的语言。这意味在未来的使用中你可以真正的转换你的认证机制。

    token原理

      1.将荷载payload,以及Header信息进行Base64加密,形成密文payload密文,header密文。

      2.将形成的密文用句号链接起来,用服务端秘钥进行HS256加密,生成签名.

      3.将前面的两个密文后面用句号链接签名形成最终的token返回给服务端

    注:

      (1)用户请求时携带此token(分为三部分,header密文,payload密文,签名)到服务端,服务端解析第一部分(header密文),用Base64解密,可以知道用了什么算法进行签名,此处解析发现是HS256。

      (2)服务端使用原来的秘钥与密文(header密文+"."+payload密文)同样进行HS256运算,然后用生成的签名与token携带的签名进行对比,若一致说明token合法,不一致说明原文被修改。

      (3)判断是否过期,客户端通过用Base64解密第二部分(payload密文),可以知道荷载中授权时间,以及有效期。通过这个与当前时间对比发现token是否过期。

    token实现思路

      1.用户登录校验,校验成功后就返回Token给客户端。

      2.客户端收到数据后保存在客户端

      3.客户端每次访问API是携带Token到服务器端。

      4.服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码

    token代码生成工具类demo

    package com.frank.common.utils;

    import com.alibaba.fastjson.JSON;
    import com.frank.common.entity.TokenHeader;
    import com.frank.common.entity.TokenPlayload;
    import com.frank.common.entity.User;

    import java.rmi.server.UID;
    import java.util.UUID;

    /**
    * Description:Token生成工具
    * 第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
    * Auth: Frank
    * Date: 2017-11-02
    * Time: 下午 5:05
    */
    public class TokenUtil {

    public static final String TOKEN_AES_KEY = "xiangli8Token";
    public static final String REFREH_TOKEN_AES_KEY = "xiangli8RefreshToken";
    public static final String JWT_TYP = "JWT";
    public static final String JWT_ALG = "AES";
    public static final String JWT_EXP = "30";
    public static final String JWT_ISS = "xiangli8";

    /**
    * 获得token
    * @param data 自定义数据
    * @param <T> 自定义数据
    * @return
    * @throws Exception
    */
    public static <T> String getToken(T data) throws Exception {
    TokenPlayload<T> userTokenPlayload = new TokenPlayload<>();
    userTokenPlayload.setExpData(data);
    String jwt = createJWT(userTokenPlayload);
    return jwt;
    }

    /**
    * 生成jwt的header部分内容
    * @return
    * @throws Exception
    */
    private static String tokenHeaderBase64() throws Exception {
    TokenHeader tokenHeader = new TokenHeader();
    tokenHeader.setTyp(JWT_TYP);
    tokenHeader.setAlg(JWT_ALG);

    String headerJson = JSON.toJSONString(tokenHeader);

    String headerBase64 = Base64Util.encryptBASE64(headerJson.getBytes());

    return headerBase64;
    }

    /**
    * 生成jwt的payload部分内容
    * @param tokenPlayload
    * @param <T>自定义的数据块
    * @return
    * @throws Exception
    */
    private static <T> String tokenPayloadBase64(TokenPlayload<T> tokenPlayload) throws Exception {
    tokenPlayload.setIss(JWT_ISS);
    tokenPlayload.setExp(JWT_EXP);

    tokenPlayload.setIat(String.valueOf(System.currentTimeMillis()));

    String headerJson =JSON.toJSONString(tokenPlayload);

    String headerBase64 = Base64Util.encryptBASE64(headerJson.getBytes());

    return headerBase64;
    }

    /**
    * 生成JWT
    * @return
    */
    public static <T> String createJWT(TokenPlayload<T> tokenPlayload) throws Exception {
    StringBuilder jwtSb = new StringBuilder();
    StringBuilder headerPlayloadSb = new StringBuilder();

    String tokenHeaderBase64 = tokenHeaderBase64();
    String tokenPayloadBase64 = tokenPayloadBase64(tokenPlayload);

    jwtSb.append(tokenHeaderBase64);
    jwtSb.append(".");
    jwtSb.append(tokenPayloadBase64);
    jwtSb.append(".");

    headerPlayloadSb.append(tokenHeaderBase64);
    headerPlayloadSb.append(tokenPayloadBase64);

    String headerPlayloadSalt = SaltUtil.addSalt(headerPlayloadSb.toString());

    String key = AesUtil.initKey(TOKEN_AES_KEY+tokenPlayload.getIat());

    String signature = Base64Util.encryptBASE64(AesUtil.encrypt(headerPlayloadSalt.getBytes(),key));

    jwtSb.append(signature);

    return Base64Util.encryptBASE64(jwtSb.toString().getBytes());
    }

    /**
    * 校验token是否是服务器生成的,以防token被修改
    * @param jwtBase64
    * @return
    * @throws Exception
    */
    public static <T> boolean verifyJWT(String jwtBase64) throws Exception {
    String jwt = new String (Base64Util.decryptBASE64(jwtBase64));

    if(!jwt.contains(".")){
    return false;
    }

    String[] jwts = jwt.split("\\.");
    if(jwts.length<3){
    return false;
    }

    TokenPlayload tTokenPlayload = JSON.parseObject(new String(Base64Util.decryptBASE64(jwts[1])),TokenPlayload.class);
    String key = AesUtil.initKey(TOKEN_AES_KEY+tTokenPlayload.getIat());

    //解析出header跟playload
    StringBuilder headerPlayloadSb = new StringBuilder();
    headerPlayloadSb.append(jwts[0]);
    headerPlayloadSb.append(jwts[1]);

    //解析signature
    String headerPlayloadSalt = new String (AesUtil.decrypt(Base64Util.decryptBASE64(jwts[2]),key));

    return SaltUtil.verifyPwd(headerPlayloadSb.toString(),headerPlayloadSalt);
    }

     

    public static void main(String[] args) throws Exception {
    String jwt = getToken(new User(1L,"你是逗逼"));
    System.out.println("jwt:"+jwt);
    System.out.println("verifyJWT:"+verifyJWT(jwt));
    }
    }

    使用说明

      1,根据上面生成一个由base64编码的token,该token由Header,Payload,Signature组成。

      2,token作为用户请求的标识,客户端保存这token的全部信息。服务端只需要保存token的Signature部分。

      3,服务端把token的Signature存于redis和服务器的数据库中。

      4,客户端请求的数据附带token,服务端拿到token,首先校验token,以防token伪造。校验规则如下:

        4.1,拆分出token的Header,Payload,Signature。

        4.2,校验Signature,通过token的header和payload生成Signature,看看生成的Signature是否和客户端附带上来的Signature一致。如果一致继续请求操作,不一致则打回操作

        4.3,查看Signature是否存在服务器的redis和数据库中。如果不存在则打回请求操作

     

    转自:https://www.cnblogs.com/lufeiludaima/p/pz20190203.html

    展开全文
  • rest-framework生成token

    2020-08-03 21:39:29
    使用rest-framework在django中创建和认证token,用于在移动端来认证和用户,本文通过自己编写模型来实现根据用户来生成token,在请求头中添加Authentication来进行认证,保持登录状态。可以直接使用,编写过程可以...
  • 今天小编就为大家分享一篇python 产生tokentoken验证的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 主要介绍了SpringBoot集成JWT生成token及校验方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • token生成原理 使用方法!

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

    什么是token?

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

    基于 Token 的身份验证

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

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

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

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

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

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

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

    5.APP登录的时候发送加密的用户名和密码到服务器,服务器验证用户名和密码,如果成功,以某种方式比如随机生成32位的字符串作为token,存储到服务器中,并返回token到APP,以后APP请求时,

    凡是需要验证的地方都要带上该token,然后服务器端验证token,成功返回所需要的结果,失败返回错误信息,让他重新登录。其中服务器上token设置一个有效期,每次APP请求的时候都验证token和有效期。

    token的优势

    1.无状态、可扩展

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

    2.安全性

    请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让我们少了对session操作。token是有时效的,一段时间之后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回的操作,通过token revocataion可以使一个特定的token或是一组有相同认证的token无效。

    3.可扩展性

    Tokens能够创建与其它程序共享权限的程序。例如,能将一个随便的社交帐号和自己的大号(Fackbook或是Twitter)联系起来。当通过服务登录Twitter(我们将这个过程Buffer)时,我们可以将这些Buffer附到Twitter的数据流上(we are allowing Buffer to post to our Twitter stream)。使用tokens时,可以提供可选的权限给第三方应用程序。当用户想让另一个应用程序访问它们的数据,我们可以通过建立自己的API,得出特殊权限的tokens。

    4.多平台跨域

    我们提前先来谈论一下CORS(跨域资源共享),对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序。Having our API just serve data, we can also make the design choice to serve assets from a CDN. This eliminates the issues that CORS brings up after we set a quick header configuration for our application.只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。Access-Control-Allow-Origin: *

    5.基于标准

    创建token的时候,你可以设定一些选项。我们在后续的文章中会进行更加详尽的描述,但是标准的用法会在JSON Web Tokens体现。最近的程序和文档是供给JSON Web Tokens的。它支持众多的语言。这意味在未来的使用中你可以真正的转换你的认证机制。

    token原理

    1.将荷载payload,以及Header信息进行Base64加密,形成密文payload密文,header密文。

    2.将形成的密文用句号链接起来,用服务端秘钥进行HS256加密,生成签名.

    3.将前面的两个密文后面用句号链接签名形成最终的token返回给服务端

    注:

    (1)用户请求时携带此token(分为三部分,header密文,payload密文,签名)到服务端,服务端解析第一部分(header密文),用Base64解密,可以知道用了什么算法进行签名,此处解析发现是HS256。

    (2)服务端使用原来的秘钥与密文(header密文+"."+payload密文)同样进行HS256运算,然后用生成的签名与token携带的签名进行对比,若一致说明token合法,不一致说明原文被修改。

    (3)判断是否过期,客户端通过用Base64解密第二部分(payload密文),可以知道荷载中授权时间,以及有效期。通过这个与当前时间对比发现token是否过期。

    token实现思路

    1.用户登录校验,校验成功后就返回Token给客户端。

    2.客户端收到数据后保存在客户端

    3.客户端每次访问API是携带Token到服务器端。

    4.服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码

    token代码生成工具类demo

    package com.frank.common.utils;

    import com.alibaba.fastjson.JSON;

    import com.frank.common.entity.TokenHeader;

    import com.frank.common.entity.TokenPlayload;

    import com.frank.common.entity.User;

    import java.rmi.server.UID;

    import java.util.UUID;

    /**

    Description:Token生成工具

    第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).

    Auth: Frank

    Date: 2020-11-05

    Time: 下午 5:05

    */

    public class TokenUtil {

    public static final String TOKEN_AES_KEY = "xiangli8Token";

    public static final String REFREH_TOKEN_AES_KEY = "xiangli8RefreshToken";

    public static final String JWT_TYP = "JWT";

    public static final String JWT_ALG = "AES";

    public static final String JWT_EXP = "30";

    public static final String JWT_ISS = "xiangli8";

    /**

    * 获得token

    * @param data 自定义数据

    * @param 自定义数据

    * @return

    * @throws Exception

    */

    public static String getToken(T data) throws Exception {

    TokenPlayload userTokenPlayload = new TokenPlayload<>();

    userTokenPlayload.setExpData(data);

    String jwt = createJWT(userTokenPlayload);

    return jwt;

    }

    /**

    * 生成jwt的header部分内容

    * @return

    * @throws Exception

    */

    private static String tokenHeaderBase64() throws Exception {

    TokenHeader tokenHeader = new TokenHeader();

    tokenHeader.setTyp(JWT_TYP);

    tokenHeader.setAlg(JWT_ALG);

    String headerJson = JSON.toJSONString(tokenHeader);

    String headerBase64 = Base64Util.encryptBASE64(headerJson.getBytes());

    return headerBase64;

    }

    /**

    * 生成jwt的payload部分内容

    * @param tokenPlayload

    * @param 自定义的数据块

    * @return

    * @throws Exception

    */

    private static String tokenPayloadBase64(TokenPlayload tokenPlayload) throws Exception {

    tokenPlayload.setIss(JWT_ISS);

    tokenPlayload.setExp(JWT_EXP);

    tokenPlayload.setIat(String.valueOf(System.currentTimeMillis()));

    String headerJson =JSON.toJSONString(tokenPlayload);

    String headerBase64 = Base64Util.encryptBASE64(headerJson.getBytes());

    return headerBase64;

    }

    /**

    生成JWT

    @return

    */

    public static String createJWT(TokenPlayload tokenPlayload) throws Exception {

    StringBuilder jwtSb = new StringBuilder();

    StringBuilder headerPlayloadSb = new StringBuilder();

    String tokenHeaderBase64 = tokenHeaderBase64();

    String tokenPayloadBase64 = tokenPayloadBase64(tokenPlayload);

    jwtSb.append(tokenHeaderBase64);

    jwtSb.append(".");

    jwtSb.append(tokenPayloadBase64);

    jwtSb.append(".");

    headerPlayloadSb.append(tokenHeaderBase64);

    headerPlayloadSb.append(tokenPayloadBase64);

    String headerPlayloadSalt = SaltUtil.addSalt(headerPlayloadSb.toString());

    String key = AesUtil.initKey(TOKEN_AES_KEY+tokenPlayload.getIat());

    String signature = Base64Util.encryptBASE64(AesUtil.encrypt(headerPlayloadSalt.getBytes(),key));

    jwtSb.append(signature);

    return Base64Util.encryptBASE64(jwtSb.toString().getBytes());

    }

    /**

    * 校验token是否是服务器生成的,以防token被修改

    * @param jwtBase64

    * @return

    * @throws Exception

    */

    public static boolean verifyJWT(String jwtBase64) throws Exception {

    String jwt = new String (Base64Util.decryptBASE64(jwtBase64));

    if(!jwt.contains(".")){

    return false;

    }

    String[] jwts = jwt.split("\\.");

    if(jwts.length<3){

    return false;

    }

    TokenPlayload tTokenPlayload = JSON.parseObject(new String(Base64Util.decryptBASE64(jwts[1])),TokenPlayload.class);

    String key = AesUtil.initKey(TOKEN_AES_KEY+tTokenPlayload.getIat());

    //解析出header跟playload

    StringBuilder headerPlayloadSb = new StringBuilder();

    headerPlayloadSb.append(jwts[0]);

    headerPlayloadSb.append(jwts[1]);

    //解析signature

    String headerPlayloadSalt = new String (AesUtil.decrypt(Base64Util.decryptBASE64(jwts[2]),key));

    return SaltUtil.verifyPwd(headerPlayloadSb.toString(),headerPlayloadSalt);

    }

    public static void main(String[] args) throws Exception {

    String jwt = getToken(new User(1L,"你是逗逼"));

    System.out.println("jwt:"+jwt);

    System.out.println("verifyJWT:"+verifyJWT(jwt));

    }

    }

    使用说明

    1,根据上面生成一个由base64编码的token,该token由Header,Payload,Signature组成。

    2,token作为用户请求的标识,客户端保存这token的全部信息。服务端只需要保存token的Signature部分。

    3,服务端把token的Signature存于redis和服务器的数据库中。

    4,客户端请求的数据附带token,服务端拿到token,首先校验token,以防token伪造。校验规则如下:

    4.1,拆分出token的Header,Payload,Signature。

    4.2,校验Signature,通过token的header和payload生成Signature,看看生成的Signature是否和客户端附带上来的Signature一致。如果一致继续请求操作,不一致则打回操作

    4.3,查看Signature是否存在服务器的redis和数据库中。如果不存在则打回请求操作

    差不多也是这些东西

    展开全文
  • 生成 Token

    千次阅读 2020-12-29 04:51:21
    # 生成 TokenToken 是一种动态密钥,通过 AppKey、AppSecret、用户名、有效时间戳等参数生成,安全性较高。在正式生产环境等对安全要求较高的场景中,我们推荐使用 Token 鉴权。TIP在生成 Token 前请确保您已经在...
  • JWT 生成Token及验证

    2019-01-22 14:10:39
    JWT生成token及验证(过期时间)用于前后断分离,及APP认证,可结合redis使用也可单独使用。
  • 七牛的Token生成

    热门讨论 2015-04-01 20:51:35
    七牛上传图片到服务器,需要一个长久的Token,目前在七牛的说明文档中没有直接说明。我现在提供一个七牛的生存方式,希望能帮助有需要的人。
  • 主要的作用就是为了安全,用户登陆时,服务器会随机生成一个有时效性的token,用户的每一次请求都需要携带上token,证明其请求的合法性,服务器会验证token,只有通过验证才会返回请求结果。 2.当token失效时,现在的...
  • 当然你也可以在应用开发中使用它,比如这篇博文中就是用它生成激活帐户的验证token。 首先在 Startup.ConfigureServices() 中注册 DataProtection 服务(注入 IDataProtectionProvider 接口的实现): public void ...
  • 其实就是向用户表里去生成一个token 这里的client_id相当于用户名,client_key相当于密码,这样后台会生成一个client_token,我们需要把这个token保存到客户端中。 前端的资源一般放在另外的服务器中,这样后台需要...
  • 其实就向clients(理解为用户表即可)里面去生成一个token    这里的client_appid 就相当于用户名,client_appkey 就相当于密码。  这样后端认证之后会生成一个access-token,我们需要把这个access-token ...
  • token的理解及token生成

    千次阅读 2020-11-27 15:42:40
    一、token的理解 在计算机身份认证中是令牌的意思,词法分析中的意思是标记...Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户
  • 主要介绍了JAVA中的Token 基于Token的身份验证实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • SpringSecurity-JWT-VERSION2(AccessToken和RefreshToken) version1太复杂,无法优化。 accessToken refreshToken流 安全登录处理流程 详细说明转到博客文章 JWT异常处理 安全异常处理(AuthenticationEntryPoint...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 231,195
精华内容 92,478
关键字:

token是怎么生成的

友情链接: thryugr_clock_adjust.rar