精华内容
下载资源
问答
  • token令牌生成和验证

    2020-07-19 11:19:44
    token令牌生成和验证

    token令牌生成和验证

    <?php
    /**
     * 登录保持的token令牌
     * 登录成功创建token令牌
     * 后续用token令牌保持登陆
     */
    
    namespace app\common\model;
    
    
    use think\facade\Request;
    
    class Token
    {
        #token文件前缀
        private $fileName = "admin_token";
        #token后台保存目录
        private $fileCatalog = "share";
        /**
         * 生成用户的token,保持登陆
         * @param  $userid  int      用户id
         * @return $token   string   用户token
         */
        public function createToken( $id )
        {
            $id_rand = rand(10,99).$id.rand(0,9);
            //设置token保存的文件目录
            $token= MD5( $id.uniqid().rand( 00000000,99999999 ) ).'_'.$id_rand;
            #获取token保存目录
            $app_model = $this->fileCatalog;
            #应用不同, token保存的目录就不同,方便万能使用
            $file_dir =  root_path()."public".DS."token".DS.$app_model.DS;
            if( !file_exists( $file_dir ) )
            {
                mkdir($file_dir,0777,true);
            }
    
            $token_file_name =$file_dir.$this->fileName."_".$id;
            $fh = fopen( $token_file_name,'w' );
            #数据
            $data['time']  = time();
            $data['token'] = $token;
            $data['id']    = $id;
            $data['ip'] = Request::ip();
            #写入
            fwrite( $fh,serialize( $data ) );
            fclose( $fh );
            return $token;
        }
        /**
         * 用户登陆验证,利用key获取管理员id
         * 3天内有登陆再次更改为3天有效key
         * @param  $token   string  管理员key
         * @return [type]   id      管理员id
         */
        public function checkToken($token)
        {
            if( $token == FALSE )
            {
                returnJson( -1001, "token不存在,请重新登陆");
            }
            $max_time=86400 * 3;  //3天过期时间,单位是秒
            $id = getTokenId( $token );  //取到用户id
            #获取token保存目录
            $app_model = $this->fileCatalog;
            $file_dir =  root_path()."public".DS."token".DS.$app_model.DS;
            $file =$file_dir.$this->fileName."_".$id;#//找到token文件
            //token存在的情况
            if( file_exists( $file ) )
            {
                $fh = @fopen($file,'r');
                //反序列化出token文件数据,等到time,key,id,ip;
                $f_code = unserialize(@fread($fh,filesize($file)));
                @fclose($fh);
    
                if($f_code['ip'] !== Request::ip())
                {
                    returnJson( -1004, "登入IP异常,请重新登录");
                }
    
                if($f_code['time']+$max_time < time())
                {
                    returnJson( -1002, "token过期,请重新登陆");
                }else
                {
                    //没有过期,过期时间重新计算,避免用户每3天登陆一次
                    $id = $f_code['id'];
                    $fh1 = fopen( $file,'w' );
                    #数据
                    $data['time']  = time();
                    $data['token'] = $token;
                    $data['id']    = $id;
                    $data['ip'] = Request::ip();
                    //重新写入当前时间,确保3天以内登陆的用户一直不需要重新登陆
                    fwrite( $fh1,serialize( $data ) );
                    fclose( $fh1 );
                    return $id;
                }
            }else
            {
                returnJson( -1003, "token异常,请重新登陆");
            }
        }
    
    }
    
    展开全文
  • token令牌生成工具类

    万次阅读 2018-06-11 15:08:02
    这里记录一个生成token的方法,token根据userId生成。此工具类包含的主要功能有: userId隐式传输,保证数据安全; 不对称加密方式,防止数据篡改;import java.io.UnsupportedEncodingException; import java....

    这里记录一个生成token的方法,token根据userId生成。

    此工具类包含的主要功能有:

        userId隐式传输,保证数据安全;

        不对称加密方式,防止数据篡改;

    import java.io.UnsupportedEncodingException;
    import java.util.Base64;
    import java.util.Random;
    import java.util.regex.Pattern;
    
    public class getOfToken {
        //定义ID位移量
        private static Integer shiftAmount = 2;
        //定义横向参数
        private static Long crossrangeAmount = 3L;
        //定义纵向参数
        private static Long portraitAmount = 21L;
        //定义前随机数位数
        private static Integer Y_Random = 4;
        //定义后随机数位数
        private static Integer Q_Random = 3;
    
        public static void main(String[] args) {
            Long userId = 4L;
            System.out.println("原始ID加密:"+getUseridOnBase(userId));
            String userID = getUseridOnBase(userId);
            System.out.println("ID解密:"+getBaseOnUserid(userID));
            System.out.println("Id移位:"+changeForId(userId));
            Long restoreForIdNum = changeForId(userId);
            System.out.println("Id归位:"+restoreForId(restoreForIdNum));
            Long confusionOperationIdNum = restoreForId(restoreForIdNum);
            System.out.println("Id混淆:"+confusionOperationId(restoreForIdNum));
            Long confusionId = confusionOperationId(restoreForIdNum);
            System.out.println("Id还原:"+reductionOperationId(confusionId));
            System.out.println("Y随机数:"+getYRandomString(Y_Random));
            System.out.println("Q随机数:"+getQRandomString(Q_Random));
            System.out.println("token117:VYX0NA==4T9 的用户ID是:"+JudgementToken("117:VYX0NA==4T9"));
            Long begin = System.currentTimeMillis();
            for(int num = 0;num<3000000;num++){
                getToken(userId);
            }
            Long end = System.currentTimeMillis();
            Long time = end - begin;
            System.out.println("time:"+time);
            Long V = 3000000L/time;
            System.out.println("token---"+getToken(userId)+"---V:"+V*1000L);
        }
    
        //通过Id生成Token    public static String getToken(Long userId){
            //定义一个BufferToken        StringBuffer Token = new StringBuffer();
            //先位移
            Long restoreForIdNum = changeForId(userId);
            //再混淆
            Long confusionId = confusionOperationId(restoreForIdNum);
            Token.append(confusionId);
            //分割符
            Token.append(":");
            //加入Y随机数
            Token.append(getYRandomString(Y_Random));
            //加入用户ID
            Token.append(getUseridOnBase(userId));
            //加入Q随机数
            Token.append(getQRandomString(Q_Random));
            //返回Token
            return Token.toString();
        }
    
        //Id移位
        public static Long changeForId(Long userId){
            String number = userId.toString();
            String[] array = number.split("");
            StringBuffer newNumber = new StringBuffer();
            //如果满足位移量,则按照位移量位移,如果不满足,则按照最低位移量位移
            if(array.length>shiftAmount){
                for(int run=shiftAmount;run<array.length;run++){
                    newNumber.append(array[run]);
                }
                for(int run=0;run<shiftAmount;run++){
                    newNumber.append(array[run]);
                }
            }else{
                if(array.length>1){
                    for(int run=1;run<array.length;run++){
                        newNumber.append(array[run]);
                    }
                    newNumber.append(array[0]);
                }else{
                    newNumber.append(array[0]);
                }
            }
            Long newNumberInt = Long.valueOf(newNumber.toString());
            return newNumberInt;
        }
    
        //Id归位
        public static Long restoreForId(Long newUserId){
            String number = newUserId.toString();
            String[] array = number.split("");
            StringBuffer newNumber = new StringBuffer();
            //如果满足位移量,则按照位移量位移,如果不满足,则按照最低位移量位移
            if(array.length>shiftAmount){
                for(int run=array.length-shiftAmount;run<array.length;run++){
                    newNumber.append(array[run]);
                }
                for(int run=0;run<array.length-shiftAmount;run++){
                    newNumber.append(array[run]);
                }
            }else{
                if(array.length>1){
                    newNumber.append(array[array.length-1]);
                    for(int run=0;run<array.length-1;run++){
                        newNumber.append(array[run]);
                    }
                }else{
                    newNumber.append(array[0]);
                }
            }
            Long newNumberInt = Long.valueOf(newNumber.toString());
            return newNumberInt;
        }
    
        //id混淆计算
        public static Long confusionOperationId(Long newId){
            //公式:aX+2ab-b = y
            return newId*crossrangeAmount+2*portraitAmount*crossrangeAmount-portraitAmount;
        }
    
        //id还原计算
        public static Long reductionOperationId(Long confusionId){
            //公式:(y+b-2ab)/a = x
            return (confusionId+portraitAmount-2*portraitAmount*crossrangeAmount)/crossrangeAmount;
        }
    
        //Y随机数,末尾为数字
        public static String getYRandomString(Integer length){
            String str="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            String strNext="0123456789";
            Random random=new Random();
            StringBuffer sb=new StringBuffer();
            for(int i=0;i<length-1;i++){
                int number=random.nextInt(36);
                sb.append(str.charAt(number));
            }
            int numberNext=random.nextInt(10);
            sb.append(strNext.charAt(numberNext));
            return sb.toString();
        }
    
        //Q随机数,第一位为数字
        public static String getQRandomString(Integer length){
            String str="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            String strNext="0123456789";
            Random random=new Random();
            StringBuffer sb=new StringBuffer();
            int numberNext=random.nextInt(10);
            sb.append(strNext.charAt(numberNext));
            for(int i=1;i<length;i++){
                int number=random.nextInt(36);
                sb.append(str.charAt(number));
            }
            return sb.toString();
        }
    
        //userIdBase64位算法
        public static String getUseridOnBase(Long userId){
            Base64.Decoder decoder = Base64.getDecoder();
            Base64.Encoder encoder = Base64.getEncoder();
            String text = userId.toString();
            String encodedText = "";
            try {
                final byte[] textByte = text.getBytes("UTF-8");
                encodedText = encoder.encodeToString(textByte);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return encodedText;
        }
        //ID解密
        public static String getBaseOnUserid(String userId){
            Base64.Decoder decoder = Base64.getDecoder();
            String userID = "";
            try {
                userID = new String(decoder.decode(userId), "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return userID;
        }
    
        //token校验及userID解析(防止token篡改)
        public static String JudgementToken(String token){
            //判断格式是否正确
            String pattern = ".*:.*";
            boolean isMatch = Pattern.matches(pattern, token);
            if(isMatch){
                //拆分
                String[] array = token.split(":");
                //ID算法串
                String truesIDStr = array[0];
                //用户ID            String userIdStr = array[1];
                if(truesIDStr.equals("") || userIdStr.equals("")){
                    return "token is error";
                }
                //算法Id还原
                Long reductionId = reductionOperationId(Long.valueOf(truesIDStr));
                //算法Id归位
                Long truesID = restoreForId(reductionId);
                //切分用户ID            String BaseID = userIdStr.substring(Y_Random,userIdStr.length()-Q_Random);
                String BaseIDStr = getBaseOnUserid(BaseID);
                Long userId = Long.valueOf(BaseIDStr);
                if(truesID.equals(userId)){
                    return truesID.toString();
                }else{
                    return "token is error";
                }
            }else{
                return "token is error";
            }
        }
    
    }

    下面是测试结果

    原始ID加密:NA==
    ID解密:4
    Id移位:4
    Id归位:4
    Id混淆:117
    Id还原:4
    Y随机数:Y670
    Q随机数:7MW
    token:117:VYX0NA==4T9 的用户ID是:token is error
    time:2425
    token---117:TK09NA==4FU---V:1237000

    展开全文
  • 颁发token令牌

    composer 安装

    composer require lcobucci/jwt 3.3
     

    在extend/tools/jwt创建Token.php

    注意:如果没有该目录,则自行创。

    生成Token(createToken)

    <?php
    namespace tools\jwt;
    
    use Lcobucci\JWT\Builder;
    use Lcobucci\JWT\Parser;
    use Lcobucci\JWT\Signer\Hmac\Sha256;
    use Lcobucci\JWT\ValidationData;
    
    /**
     * Created by PhpStorm.
     * User: asus
     * Date: 2019/4/5
     * Time: 13:02
     */
    class Token
    {
         public static function createToken($uid = null)
         {
                $signer = new Sha256();//加密规则
                $time = time();//当前时间
     
                $token = (new Builder())
                    ->issuedBy('teacher')//签发人
                    ->canOnlyBeUsedBy('student')//接收人
                    ->identifiedBy('MarsLei', true) //标题id
                    ->issuedAt($time)//发出令牌的时间
                    ->canOnlyBeUsedAfter($time) //生效时间(即时生效)
                    ->expiresAt($time + 3600) //过期时间
                    ->with('uid', $uid) //用户id
                    ->sign($signer, 'my') //签名
                    ->getToken(); //得到token
                return (string)$token;
            }
    }

    验证Token(verifyToken)

    public static function verifyToken($token=null){
            //检测是否接收到了token
            if(empty($token)){
                return 0;
            }
            //转化为可以验证的token
            $token = (new Parser())->parse((string) $token);
            //验证基本设置
            $data = new ValidationData();
            $data->setIssuer('teacher');
            $data->setAudience('student');
            $data->setId('MarsLei');
    
            if(!$token->validate($data)){
                return 0;
            }
            //验证签名
            $signer = new Sha256();
            if(!$token->verify($signer, 'my')){
                return 0;
            }
            //验证通过,返回用户id
            return $token->getClaim('uid');
        }

    获取Token(getRequestToken)

    public static function getRequestToken()
        {
            if (empty($_SERVER['HTTP_AUTHORIZATION'])) {
                return false;
            }
    
            $header = $_SERVER['HTTP_AUTHORIZATION'];
            $method = 'bearer';
            //去除token中可能存在的bearer标识
            return trim(str_ireplace($method, '', $header));
        }

    回收实例

    1. 重写apache

        RewriteCond %{HTTP:Authorization} ^(.+)$
        RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

     2. 回收token

    
        //清空token  将需清空的token存入缓存,再次使用时,会读取缓存进行判断
        $token = \Token::getRequestToken();
        $delete_token = cache('delete_token') ?: [];
        $delete_token[] = $token;
        cache('delete_token', $delete_token, 86400);
        $this->ok();

    展开全文
  • MD5加密+Token令牌生成

    千次阅读 2018-08-06 10:29:55
     Token令牌生成器  public class TokenUtils { private final static Logger LOG = LogManager.getLogger(TokenUtils.class); /** * token令牌的生成策略是:使用用户名+密码进行base64的编码 * @...

           在程序的登录注册模块,我们往往要对用户的密码进行加密,下面我们写一个MD5加密的程序。 

    package com.qf.shopping.utils;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    import org.springframework.util.Base64Utils;
    public class Md5utils {
    	public static String getMd5val(String val) throws NoSuchAlgorithmException{
    		String salt = "li";
    		//获取一个Md5实例
    		MessageDigest digest = MessageDigest.getInstance("MD5");
    		//使用这个MD5生成值
    		byte[] buf = digest.digest((val+salt).getBytes());
    		return new String(Base64Utils.encode(buf));
    	}
    }
    

               Token令牌生成器 

    public class TokenUtils {
    	private final static Logger LOG = LogManager.getLogger(TokenUtils.class);
    
    	/**
    	 * token令牌的生成策略是:使用用户名+密码进行base64的编码
    	 * @throws UnsupportedEncodingException 
    	 */
    	
    	public static String getToken(String userLoginName, String userPwd) throws UnsupportedEncodingException{
    		
    		return new String(Base64Utils.encode((userLoginName+userPwd).getBytes()),"utf-8").replace("=","");
    	}
    }

                                                                              未。。。。。。

    展开全文
  • TP5.1使用JWT进行Token令牌生成与验证

    千次阅读 2019-08-05 16:24:21
    传统互联网项目在实现保持登录状态、退出登录、接口请求等功能时会使用...但是Token不会产生这些问题,服务器端对Token只有生成和验证操作,不会存放数据,针对前后端分离的项目,包括手机APP和当前热门的小程序的...
  • 这是一个token的示例,众所周知,token是用于后台服务器认证浏览器的一种技术,它弥补了cookie对数据大小限制和安全性问题
  • 主要介绍了PHP token验证生成原理,结合实例形式分析了php的token验证原理与使用技巧,需要的朋友可以参考下
  • 微信小程序+TP5——token令牌生成

    千次阅读 2018-10-24 17:06:24
    token令牌的作用:客户端每次登录服务器端都会生成一个唯一的token令牌值,并返回到客户端,而服务器端会默认将token令牌值作为key, 用户信息作为value,一一对应存入缓存中,当用户每一次发送请求时,都要携带这个...
  • 生成 token 令牌

    千次阅读 2018-06-26 15:55:26
    import java.security.MessageDigest;... * 功能:生成token&lt;br&gt; * 作者:张tt&lt;br&gt; * 时间:2017年6月26日&lt;br&gt; * 版本:1.0&lt;br&gt; ...
  • 今天小编就为大家分享一篇laravel5.5安装jwt-auth 生成token令牌的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • asp.net webapi2 基于token令牌的身份验证 通过浏览器模拟附加token的headers请求授权
  • token令牌

    千次阅读 2018-07-15 10:49:38
    防止重复刷新提交:token令牌.创建一个单例模式,防止两人同时提交,使用synchronzied关键字使线程安全.使用通用识别码随机生成一个uuidpackage com.dt64.util;import java.util.UUID;public class Stoken { static ...
  • 导入依赖 koa、koa-router、basic-auth、jsonwebtoken // package.json "dependencies": { "basic-auth": "^2.0.1", "jsonwebtoken": "^8.4.0", "koa": "^2.7.0", "koa-router": "^7.4.0" ...生成token...
  • 令牌生成器 离线令牌生成器和验证器 它是什么,它有什么作用? 它工作在一个动态变量之上,一个过期的时间戳。 我们简单地从中创建两个字符串:一个哈希部分和一个混淆的时间戳,然后将它们连接成一个字符串,瞧,...
  • token 令牌完整介绍及使用

    千次阅读 2020-04-06 23:09:39
    介绍 举个例子:比如你想去公园,这个 token 就相当于门票,你只有拿...当用户登陆完成之后,服务端会生成一个令牌。并将令牌返回给前端 前端得到令牌之后将其保存。 当调用敏感的接口时,需要传递token. 服务端会...
  • Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
  • 什么是 Token 令牌

    千次阅读 2020-07-22 11:55:20
    在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思. ...密保令牌(Security token),或者硬件令牌,例如U盾,或者叫做认证令牌或者加密令牌,一种计算机身份校验的物理设备 会话令牌(Se...
  • token的理解及token生成

    千次阅读 2020-11-27 15:42:40
    一、token的理解 在计算机身份认证中是令牌的意思,词法分析中的意思是标记...Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户
  • /** * token生成工具类 * @author 3htp * */ public class JwtUtils { /** * 生成token * @param userId * @param loginName * @param roles * @param key * @param l * @return */ public ...
  • Spring Cloud OAuth Token 生成源码解析

    千次阅读 2019-05-27 10:45:23
    在这个接口里,它会根据请求传递过来的grant_type去挑一个具体的实现来执行令牌生成的逻辑。 5.不论采用哪种方式进行令牌的生成,在这个生成的过程中都会产生两个对象,一个是OAuth2Request,这个对象实际上是之前...
  • APP校验 Token生成流程

    千次阅读 2017-12-12 10:28:52
    GitHub:... ...nimbus-jose-jwt-4.13.1.jar (一款开源的成熟的JSON WEB TOKEN 解决方法,本仓库的代码是对其的进一步封装)json-smart-2.0-RC2.jar和asm-1.0-RC1.jar (依赖jar包,主要用于JSONO
  • Token令牌入门学习一

    万次阅读 2018-06-01 17:51:02
    在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思. 如果觉得文章不错,对你有帮助,请作者喝杯咖啡,谢谢!如果对您有帮助 ,请多多支持....!!打开支付宝首页搜...Token, 令牌,代表执...
  • tp5 生成token 验证token 解密token

    千次阅读 2020-05-22 18:37:49
    生成Token /** * 创建 token * @param array $data 必填 自定义参数数组 * @param integer $exp_time 必填 token过期时间 单位:秒 例子:7200=2小时 * @param string $scopes 选填 token标识,请求接口的token ...
  • 获取特斯拉令牌 用于获取Tesla令牌的简单node.js服务器 为什么要使用服务器? Tesla SSO服务只能在他们的应用程序和网站上使用,而阻止我们从任何其他网页上访问它。 服务器充当代理来绕过此请求,并在不存储任何...
  • token生成原理 使用方法!

    千次阅读 2021-03-15 14:58:21
    Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。...
  • package cn.sdut.util; import java.util.UUID; import javax.servlet.http.HttpServletRequest; public class TokenUtil { ... private TokenUtil(){ ... // 生成令牌 public static void saveToken(HttpServletReq
  • Springboot token令牌验证解决方案 在SpringBoot实现基于Token的用户身份验证
  • JAVA后端生成Token令牌),用于校验客户端

    万次阅读 多人点赞 2019-06-13 15:59:07
    1.概述:在web项目中,服务端和前端经常需要交互数据,有的时候由于网络相应慢,客户端在提交某些敏感数据(比如按照...②后端处理:对于每次提交到后台的数据必须校验,也就是通过前端携带的令牌(一串唯一字符串...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,050
精华内容 15,620
关键字:

token令牌怎么生成