精华内容
下载资源
问答
  • token前后端分离中,后台token工具类设计实现: 依赖jar包 gradle配置: //token util tools jar compile ‘com.nimbusds:nimbus-jose-jwt:5.4’ 生成token、校验token和解析token用户信息 import ...

    在token前后端分离中,后台token工具类设计实现:

    1. 依赖jar包
      gradle配置:
      //token util tools jar
      compile ‘com.nimbusds:nimbus-jose-jwt:5.4’

    2. 生成token、校验token和解析token用户信息

       import java.util.Date;
       import java.util.HashMap;
       import java.util.Map;
       import org.apache.commons.lang3.StringUtils;
       import org.springframework.util.CollectionUtils;
       import com.google.gson.Gson;
       import com.nimbusds.jose.JWSAlgorithm;
       import com.nimbusds.jose.JWSHeader;
       import com.nimbusds.jose.JWSObject;
       import com.nimbusds.jose.JWSSigner;
       import com.nimbusds.jose.JWSVerifier;
       import com.nimbusds.jose.Payload;
       import com.nimbusds.jose.crypto.MACSigner;
       import com.nimbusds.jose.crypto.MACVerifier;
       import net.minidev.json.JSONObject;
       
       /**
        * token工具类
        *
        * @author ***
        * @version Created:2018年12月26日
        * 
        */
       public class TokenUtil {
       
       	/****
       	 * 依赖jar包: 
       	 * compile com.nimbusds:nimbus-jose-jwt:5.4 compile
       	 * com.google.code.gson:gson:2.8.5
       	 */
       	/**
       	 * 1.创建一个32-byte的密匙
       	 */
       
       	private static final byte[] SECRET_KEY = "xxxxxxxxxxx".getBytes();
       
       	/****
       	 * token创建时间 (避免key被自定义保存数据覆盖)
       	 */
       	private static final String CREATE_TIME_KEY = "__cas_create_time";
       
       	/****
       	 * token失效时间
       	 */
       	private static final String INVALID_TIME_KEY = "__cas_invalid_time";
       
       	/****
       	 * 生成token
       	 * 
       	 * @param payloadMap
       	 *            用户数据信息
       	 * @param invalidTime
       	 *            失效时间
       	 * @return
       	 */
       	public static String createToken(Map<String, Object> payloadMap, long createTime, long invalidTime) {
       		try {
       			if (invalidTime < createTime) {
       				System.out.println("====> 失效时间必须大于创建时间...");
       				return null;
       			}
       			if (CollectionUtils.isEmpty(payloadMap)) {
       				payloadMap = new HashMap<String, Object>();
       			}
       			payloadMap.put(CREATE_TIME_KEY, System.currentTimeMillis());
       			payloadMap.put(INVALID_TIME_KEY, invalidTime);
       			System.out.println("====> 生成token用户信息为:" + GsonUtil.toJson(payloadMap));
       			// 3.先建立一个头部Header
       			/**
       			 * JWSHeader参数:1.加密算法法则,2.类型,3.其它 一般只需要传入加密算法法则就可以。 这里则采用HS256
       			 * 
       			 * Payload 建立一个载荷
       			 *
       			 * JWSAlgorithm类里面有所有的加密算法法则,直接调用。
       			 */
       			// 将头部和载荷结合在一起
       			JWSObject jwsObject = new JWSObject(new JWSHeader(JWSAlgorithm.HS256),
       					new Payload(new JSONObject(payloadMap)));
       
       			// 建立一个密匙
       			JWSSigner jwsSigner = new MACSigner(SECRET_KEY);
       			// 签名
       			jwsObject.sign(jwsSigner);
       
       			// 生成token
       			return jwsObject.serialize();
       		} catch (Exception e) {
       			System.out.println("====> 创建token失败:" + e);
       			e.printStackTrace();
       			return null;
       		}
       	}
       
       	/****
       	 * 解析出token的Payload部分数据信息
       	 * 
       	 * @param token
       	 * @return
       	 * @since 2018.12.26
       	 */
       	public static Map<String, Object> parsePayloadData(String token) {
       		try {
       			if (StringUtils.isEmpty(token)) { 
       				return null;
       			}
       			// 解析token
       			JWSObject jwsObject = JWSObject.parse(token);
       			// 获取到载荷
       			Payload payload = jwsObject.getPayload();
       			// 建立一个解锁密匙
       			JWSVerifier jwsVerifier = new MACVerifier(SECRET_KEY);
       
       			Map<String, Object> resultMap = null;
       			// 判断token
       			if (jwsObject.verify(jwsVerifier)) { // 校验成功(未校验是否过期)
       				// 载荷的数据解析成json对象。
       				JSONObject jsonObject = payload.toJSONObject();
       				Gson gson = new Gson();
       				resultMap = gson.fromJson(gson.toJson(jsonObject), Map.class);
       			}
       			return resultMap;
       		} catch (Exception e) {
       			System.out.println("====> 解析token失败: " + e);
       			e.printStackTrace();
       			return null;
       		}
       	}
       
       	/****
       	 * 校验token是否过期
       	 * 
       	 * @param token
       	 * @return 0-有效 1-失效 2-校验失败
       	 * @since 2018.12.26
       	 */
       	public static boolean validToken(String token) {
       		try {
       			if (StringUtils.isEmpty(token)) {
       				return false;
       			}
       			// 解析token
       			JWSObject jwsObject = JWSObject.parse(token);
       
       			// 获取到载荷
       			Payload payload = jwsObject.getPayload();
       
       			// 建立一个解锁密匙
       			JWSVerifier jwsVerifier = new MACVerifier(SECRET_KEY);
       			// 判断token
       			if (jwsObject.verify(jwsVerifier)) {
       				// 载荷的数据解析成json对象。
       				JSONObject jsonObject = payload.toJSONObject();
       				// 判断token是否过期
       				if (jsonObject.containsKey(INVALID_TIME_KEY)) {
       					Long invalidTime = Long.valueOf(jsonObject.get(INVALID_TIME_KEY).toString());
       					Long nowTime = new Date().getTime();
       					System.out.println(" nowTime: " + nowTime + ", invalidTime:" + invalidTime);
       					// 判断是否过期
       					if (invalidTime > nowTime) {
       						System.out.println("token有效");
       						// token有效
       						return true;
       					}
       				}
       			}
       			return false;
       		} catch (Exception e) {
       			System.out.println("====> 解析token失败...");
       			e.printStackTrace();
       			return false;
       		}
       	}
       
       	/**
       	 * 校验token是否合法,返回Map集合,集合中主要包含 state状态码 data鉴权成功后从token中提取的数据
       	 * 该方法在过滤器中调用,每次请求API时都校验
       	 * 
       	 * @param token
       	 * @return Map<String, Object>
       	 */
       	/*public static Map<String, Object> validTipsToken(String token) {
       		Map<String, Object> resultMap = new HashMap<String, Object>();
       		try {
       			JWSObject jwsObject = JWSObject.parse(token);
       			Payload payload = jwsObject.getPayload();
       			JWSVerifier verifier = new MACVerifier(SECRET_KEY);
       
       			if (jwsObject.verify(verifier)) {
       				JSONObject jsonOBj = payload.toJSONObject();
       				// token校验成功(此时没有校验是否过期)
       				resultMap.put("state", TokenState.VALID.toString());
       				// 若payload包含ext字段,则校验是否过期
       				if (jsonOBj.containsKey("ext")) {
       					long extTime = Long.valueOf(jsonOBj.get("ext").toString());
       					long curTime = new Date().getTime();
       					// 过期了
       					if (curTime > extTime) {
       						resultMap.clear();
       						resultMap.put("state", TokenState.EXPIRED.toString());
       					}
       				}
       				resultMap.put("data", jsonOBj);
       
       			} else {
       				// 校验失败
       				resultMap.put("state", TokenState.INVALID.toString());
       			}
       
       		} catch (Exception e) {
       			// e.printStackTrace();
       			// token格式不合法导致的异常
       			resultMap.clear();
       			resultMap.put("state", TokenState.INVALID.toString());
       		}
       		return resultMap;
       	}*/
       
       	public static void main(String[] args) {
       		Map<String, Object> sessionUser = new HashMap<String, Object>();
       		sessionUser.put("loginName", "admin");
       		sessionUser.put("email", "pingfan_wzc@163.com");
       		sessionUser.put("phone", "15801306497");
       		// 单元测试1:success
       		long createTime = new Date().getTime();
       		long invalidTime = new Date().getTime() + 10 * 60 * 1000;
       		String token = createToken(sessionUser, createTime, invalidTime);
       		System.out.println("生成token1:" + token);
       		// 单元测试2:sessionUser 为null
       		String token2 = createToken(null, createTime, invalidTime);
       		System.out.println("生成token2: " + token2);
       
       		System.out.println("token1是否有效:" + validToken(token));
       		System.out.println("token2是否有效:" + validToken(token2));
       		// 解析用户信息
       		Map<String, Object> parseUser = parsePayloadData(token);
       		System.out.println("====> 解析token1用户信息为:" + new Gson().toJson(parseUser));
       		parseUser = parsePayloadData(token2);
       		System.out.println("====> 解析token2的用户信息为:" + new Gson().toJson(parseUser));
       
       		// 单元测试3:token失效
       		String token3 = createToken(sessionUser, createTime, System.currentTimeMillis());
       		System.out.println("生成token3: " + token3);
       		System.out.println("token3是否有效:" + validToken(token3));
       		System.out.println("解析token3的用户信息为:" + new Gson().toJson(parsePayloadData(token3)));
       
       	}
       }
      
    3. 跨域接收token参数配置

       public class CorsFilter implements Filter {
          public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
       	   	HttpServletResponse response = (HttpServletResponse) res;
               log.info("====>调用到此方法...");
        
               HttpServletRequest request = (HttpServletRequest) req;       
               log.info("====> " + request.getRequestURI() + " X-Requested-With: " + request.getHeader("X-Requested-With"));
               String token = RequestUtils.getHeaderToken(request, AppConstants.RISK_ACCESS_TOKEN);
               System.out.println("====> token: " + token);
               
               response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));
               response.setHeader("Access-Control-Allow-Credentials", "true");
               response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE,PUT");
       //        response.setHeader("Access-Control-Max-Age", "3600");
               response.setHeader("Access-Control-Allow-Headers", "**cas_access_token**,X-Requested-With,Content-Type");
               //response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
       	   //}
       	   //index++;
               chain.doFilter(request, response);
           }
           public void init(FilterConfig filterConfig) {}
           public void destroy() {}
       }
      

    其中,cas_access_token是token的key。

    参考网址:@link http://www.cnblogs.com/dragonetyu/p/7591745.html

    展开全文
  • SrpingCloud项目 前端访问后台出现token过期 前端访问后台出现token过期,直接跳转登录页面 错误码401 问题如上 ,在网上搜了一些解决方案,说是token识别不了,然后我就去找配置文件,因为项目是迁移之前的老项目,...

    SrpingCloud项目 前端访问后台出现token过期

    前端访问后台出现token过期,直接跳转登录页面 错误码401

    问题如上 ,在网上搜了一些解决方案,说是token识别不了,然后我就去找配置文件,因为项目是迁移之前的老项目,用的nacos配置中心,用Spring Security Oauth2 来整合Token

    然后发现nacos当前项目的配置文件中没有配置Oauth2 ,然后配置了

    	security:
    		oauth2:
    			resource:
    				id:项目配置文件ID
    				user-infe-uri:地址:端口号/参数信息(127.0.0.1:8080/users/user)
    				prefer-token-info:false (prefer-token-info默认值为true,既优先使用token-info-uri校验token认证信息)
    
    展开全文
  • 记一次 golang 写微信公众号后台配置时提示token验证失败的奇怪问题 可能的解决方案 按照微信官方的文档,很快写好了golang版本的微信公众号签名代码,验证的时候却一直提示token验证失败,以前用php写的时候都是一...

    记一次 golang 写微信公众号后台配置时提示token验证失败的奇怪问题

    可能的解决方案

    按照微信官方的文档,很快写好了golang版本的微信公众号签名代码,验证的时候却一直提示token验证失败,以前用php写的时候都是一次就过了,这次却花了很长时间找不到原因,不过最终还是蜜汁通过了。
    中间做过的操作有:
    1、将服务器ip加入ip白名单。
    2、尝试使用https的域名。
    3、尝试自己访问https的接口验证url
    最后提交的时候,微信很抽风地提示可以了,真的是很无语。

    观察到的异常现象

    虽然浏览器能够直接得到返回的echostr,但是微信一直不行,中间查看命令行输出参数,有明显的不同:
    微信服务器的请求是带有301跳转的,而自己在浏览器上的请求是没有这个跳转的,直接返回的就是200
    如下图所示:
    在这里插入图片描述

    问题很迷惑,至今无法知晓答案茶。

    展开全文
  • 启动服务器 配置服务器 服务器进行token验证 <... // 微信后台设置的token值 php7.1之后可以加权限 private const TOKEN = 'weixin'; // 构造方法 public function __constru...
    1. 启动服务器

    2. 配置服务器

    3. 服务器进行token验证

      <?php
      //验证token
      $wx = new Wx();
      
      class Wx {
          // 微信后台设置的token值 php7.1之后可以加权限 private
          const TOKEN = 'weixin';
      
          // 构造方法
          public function __construct(){
              // 判断是否是第1次接入 echostr
              if (!empty($_GET['echostr'])) {
                  echo $this->checkSign();
              }else{
                  // 接受处理数据
                  $this->acceptMsg();
              }
          }
      
          /**
           * 初次接入校验
           * @return [type] [description]
           */
          private function checkSign(){
              // 得到微信公众号发过来的数据
              $input = $_GET;
              // 把echostr放在临时变量中
              $echostr = $input['echostr'];
              $signature = $input['signature'];
              // 在数组中删除掉
              unset($input['echostr'],$input['signature']);
              // 在数据中添加一个字段token
              $input['token'] = self::TOKEN;
              // 进行字典排序
              $tmpStr = implode( $input );
              // 进行加密操作
              $tmpStr = sha1( $tmpStr );
              // 进行比对
              if ($tmpStr === $signature) {
                  return $echostr;
              }
              return '';
          }
      
      
          
      }

       

    4. 提交

    5. 配置成功
    展开全文
  • 关于ThinkPHP框架开发微信公众号在微信后台配置服务器URL提示Token验证失败的解决方案
  • cookie是随着url将参数发送到后台,安全性最低,并且大小受限,不超过4kb左右,它的数据保存在客户端 session session数据保存在服务端,在内存中开辟空间存储数据,session文件名即sessionID保存在cookie内,随...
  • @微信公众号修改服务器配置token验证失败 微信公众号修改服务器配置token验证失败 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下...
  • &lt;?php /** * wechat php test ... */ //define your token define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); $wechatObj-&gt;valid(); class ...
  • 之前一直报 token 错误 小程序配置消息推送,微信服务器会发送验证 @RequestMapping(method = RequestMethod.GET) @ResponseBody public void get(HttpServletRequest request, HttpServletResponse response) ...
  • NodeJS 中配置token 首先安装jsonwebtoken第三方模块 npm i jsonwebtoken 文档说明 使用的基本格式 jwt.sign(payload,secret,expiresIn) 其中payload是需要保存的数据 secret密匙,在设置token和解析token的时候都...
  • iOS13苹果登录的后台验证token(JAVA)

    千次阅读 热门讨论 2019-11-29 16:13:21
    1.向苹果后台获取公钥参数(后台发送http请求工具类请自行配置,json转换工具也请自行使用) * * HttpClientResult httpClientResult = null ; try { httpClientResult = HttpClientUtils . doGet ( ...
  • 后台管理系统token

    2021-04-19 17:33:09
    1.2token只能在当前网页打开期间生效,所以将token保存在sessionStorage中 login(){ this.$refs.loginFormRef.validate(async valid => { if (!valid) return; const { data: res } = await this.$http.post(...
  • [微信小程序]消息推送配置Token令牌错误@Author GQ 2017年07月26日 本想在微信小程序中接入上传图片到阿里云功能,小程序中查询很多资料还是没能将图片转成流上传, 所以无奈只能借助小程序官方API中客服转发功能上传...
  • 服务器配置Token验证失败

    千次阅读 2018-06-28 23:13:33
    放在页面顶部即可  if(strtolower($_SERVER['REQUEST_METHOD']) == 'get') { ... //记录访问IP到log日志 ...//记录请求字符串到log日志 ... //记录是否获取到echostr参数 ... //把echostr参数返回给微信开发者后台 }  
  • Vue中使用axios拦截器 axios拦截器如何单独配置token 在了解到cookie、session、token的作用后学习token的使用 cookie cookie是随着url将参数发送到后台,安全性最低,并且大小受限,不超过4kb左右,它的数据保存在...
  • SpringMVC后台token防重复提交解决方案

    千次阅读 2018-03-16 14:27:12
    SpringMVC后台token防重复提交解决方案 本文介绍如何使用token来防止前端重复提交的问题。 目录 1.思路 2.拦截器源码实现 3.注解源码 4.拦截器的配置 5.使用指南 6.结语 思路 1.添加拦截器,拦截...
  • 【java】微信服务器配置 Token验证

    千次阅读 2018-08-30 11:04:54
    Token:自主设置,这个token与公众平台wiki中常提的access_token不是一回事。这个token只用于验证开发者服务器。 根据官方开发文档,服务器需要接收参数并进行验证,验证通过后再返回其中一个参数 接收,并...
  • 那请教过微信开发的朋友后得知这个token是需要传到后台验证后传回微信的,最简单的示例代码如下,这样你的验证就能过了。   using System; using System.Collections.Generic; using System.Linq; using ...
  • ①、查看我们服务器上的微信公众号模块的配置是否与公众号管理后台的一致,主要核对:appId,appSecret,token,随机码也可以核对一下,如果appSecret忘记或者被其他人重置我们不知道的情况下,就扫码申请重置appSecret...
  • 有时候我们发现所有的配置都设置好了,网上也查了不少的资料,还是不行 请您检查这几项: 1. 在您的URL(服务器地址)页面里,直接Get获取echostr参数打印到页面上。 在火狐浏览器里Firebug里面看到echostr前面多...
  • 上文中描述了开发公众号所需要的准备工作,本文讲解如何搭建工程,如何实现账号的接口配置。一、环境说明:开发工具:EclipseJDK版本:JDK1.8Servlet容器:Tomcat8.5内网穿透工具:NATAPP本教程基于Servlet来做请求...
  • 2.TOKEN设置的与后台设置的是否一致 然后确定一下后台代码有没有写错。 网上的很多人说在echo $echoStr语句前加ob_clean(),如图:我也有加,我加了也不行 重点来了:一般TP框架微信类放在控制器...
  • 一般来说服务器配置token验证失败,可能有以下几个方面: 1.服务器ip或者域名没有认证备案(可以通过Natapp购买隧道,获取备案域名) 2.自己的服务器没有正常运行(基本不可能) 3.获取到的请求数据乱码(也没有...
  • 消息推送配置Token令牌错误@Author GQ 2017年07月26日 本想在微信小程序中接入上传图片到阿里云功能,小程序中查询很多资料还是没能将图片转成流上传, 所以无奈只能借助小程序官方API中客服转发功能上传素材间接实现:...
  • 用NotPad++打开,是否为UTF-8无BOM编码格式,不是专为UTF-8无BOM编码格式 2、检查微信后台Token(令牌)前后是否有空格 有空格把空格去掉 ...3、检查微信后台Token与服务器后台Token是否一致 ...
  • springboot2 使用前后台分离,token放入header进行验证的配置 注意 registry.addInterceptor(new MyInterceptorConfig ()); 不能添加,否则header下token有时无法获取到 @Configuration public class ...
  • ios或者安卓在登入的时候为了统一校验,一般的的情况下会到一个共同的接口进行检验,这里用java做了一个简单的后台接口用于ios或者安卓登入校验。后台的java框架是SSM框架。 下边是校验的流程: 使用的maven,...
  • 相信大家在做微信公众号开发的时候,都遇到过token配置失败的问题。那么我就帮助大家来解决这个问题。废话不说,直接上代码 if(strtolower($_SERVER['REQUEST_METHOD']) == 'get') { file_put_contents('weixin_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,173
精华内容 19,669
关键字:

后台配置token