服务器验证:服务器验证用户的凭据,如果验证成功: 生成一个AccessToken,这个令牌通常具有较短的有效期,比如几分钟到几小时。 二、存储AccessToken和RefreshToken 客户端存储:在Web应用中,通常将AccessToken存储在内存中或LocalStorage中。 使用AccessToken 发送请求:客户端在每次请求受保护资源时,都需要在HTTP请求的头部(Header)中包含AccessToken。 三、刷新AccessToken 监控过期时间:客户端需要监控AccessToken的有效期,并在接近过期时自动刷新。 刷新流程: 使用存储的RefreshToken向服务器发送刷新请求。 服务器验证RefreshToken的有效性,如果有效,生成一个新的AccessToken和一个新的RefreshToken返回给客户端。
多系统共用accesstoken 当一个公众号或者小程序接入多个系统时,由于微信接口的限制,会导致accesstoken调用次数超出有效范围,故微擎系统提供了下面的接口,供其他系统调用。 URL 请求方式: GET http://域名/api/accesstoken.php? type=TYPE&appid=APPID&secret=SECRET 1 返回 正常情况下,会返回下述JSON数据包: { “accesstoken”:“ACCESS_TOKEN” } accesstoken } $account_api = WeAccount::createByUniacid($account_info['uniacid']); $result = array('accesstoken > 未经允许不得转载:肥猫博客 » [微擎]多系统共用accesstoken
当然仅仅是没有修改默认accessToken并不能形成RCE的条件,远程访问需要host加port,默认是9999(或者自定义端口),所以如果存在默认accessToken加executor的执行端口对外开放 =default_token 这里为了复现默认accessToken漏洞,不做修改,使用默认的即可。 打开工具很轻易扫描出来我们搭建的xxl-job-executor存在默认accessToken权限绕过漏洞。 使用默认的accessToken,技术能力缺失或者偷懒。 应用程序能随便出网。 应用进程能执行bash。 2.修改默认accessToken 使用脚本或者工具生成一个相对比较复杂的accessToken,禁用默认的default_token。
image-1647246662227.png 2.根据官方文档中的请求连接传入正确的参数即可获取到AccessToken值 【特别说明:此处的AccessToken值有效期为7天,返回数据中的RefreshToken 理论上,AccessToken永久有效,但是需要定期刷新Token的到期时间。】 accessToken = new AccessToken(); accessToken.setId(IdGen.uuid()); accessToken.setAccessToken(token ); accessToken.setTicket(refreshToken); accessToken.setLx("10"); // 设置成类型10 即为闪送接口存储值的地方 accessTokenService.insert (accessToken); } return result; } AccessToken刷新 image.png 此处也是按照正常情况下的操作编写出接口即可,值得注意的是:此处签名的规范是按照
对于暂时没有这些权限的微信公众号,开发者可以申请测试账号来体验和测试微信公众平台的所有高级接口功能
对于暂时没有这些权限的微信公众号,开发者可以申请测试账号来体验和测试微信公众平台的所有高级接口功能
官方介绍 官方文档中可以看到: 为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯; 调度中心和执行器,可通过配置项 “xxl.job.accessToken” 进行AccessToken的设置。 调度中心和执行器,如果需要正常通讯,只有两种设置; 设置一:调度中心和执行器,均不设置AccessToken;关闭安全性校验; 设置二:调度中心和执行器,设置了相同的AccessToken; 调度中心配置 调度中心配置文件地址: /xxl-job/xxl-job-admin/src/main/resources/application.properties 调度中心 AccessToken 配置如下: ### 调度中心通讯TOKEN [选填]:非空时启用; xxl.job.accessToken=sffsfststsrter 执行器配置 执行器 AccessToken 配置如下: xxl: job
前言 众所周知,在微信公众平台开发中,其实就是一系列的API请求和自身业务系统的集成,而在API请求中,AccessToken是优势一个必不可少的参数。 需要注意的点: 在有效期内,重复获取不会返回新的AccessToken,并且不会延长有消息。(即使不在同一个程序内获取) AccessToken可能会提前过期。 问题:运行一段时间再次出现异常,程序在获取AccessToken过程中出现阻塞,后续代码均未执行,定时器也无法执行。 影响:两次带来的影响都是致命的,犹如定时炸弹,完全不清楚下次会何时继续出现。 ---- 改进方案 总结: 此方案的优点在于,程序无需通过定时器或线程去处理AccessToken,通过Redis的缓存,并设置过期时间,实现动态的管理,并能和其他程序共享AccessToken(对于多个程序需要使用同一个应用时 WXAPIUtil类 WXAPIUtil为封装的企业微信相关API操作的类,如:获取AccessToken获取,更新,删除用户信息,获取,创建,更新部门信息等。
0x02 漏洞概述 XXL-JOB 默认配置下,用于调度通讯的 accessToken 不是随机生成的,而是使用 application.properties 配置文件中的默认值。 glueUpdatetime": 1586693836766, "broadcastIndex": 0, "broadcastTotal": 0 } 0x06 修复方式 修改调度中心和执行器配置项 xxl.job.accessToken xuxueli/xxl-job https://www.xuxueli.com/xxl-job/#5.10%20%E8%AE%BF%E9%97%AE%E4%BB%A4%E7%89%8C%EF%BC%88AccessToken
Client对象还包含一个IdentityTokenLifetime属性,是用来设置ID Token的存活时间,但是,我们获得AccessToken以后,访问API资源等,是用的授权,此属性无法影响AccessToken 四.时间偏移(ClockSkew ) 有这样的场景,如果你的AccessToken还有5s过期,这时你通过这个AccessToken去访问API资源,但是这时网络堵塞,可能请求10s才到达目标,那这时怎么办 如果需要保持所持有的AccessToken一直有效,是否需要提前刷新或者再次申请AccessToken? 上述的这些问题,都是我们将时间理想化了,所以当我们的API资源受到请求根据AccessToken进行验证的时候,会有一个时间偏移,通俗的讲就是将AccessToken的逻辑过期时间往后推迟了,这个时间默认是 比如我们的AccessToken应该在2018年5月6日16:50:55过期,那么实际上在API资源进行验证的时候,容忍在过期时间后的五分钟以内,此AccessToken依然是有效的,即在API资源验证时
ApiBoot Security内部提供了两种方式进行读取需要认证的用户信息,在之前的文章中讲到过ApiBoot Security使用内存方式(memory)不写一行代码就可以实现用户的认证并获取AccessToken 内存方式 内存方式(memory)是将用户信息(用户名、密码、角色列表)在application.yml文件内配置,可配置多个用户,项目启动后将用户信息加载到内存中,用于获取AccessToken时的认证 获取AccessToken 由于学习者的本机环境不同,下面采用两种方式进行获取AccessToken。 CURL方式 执行如下命令获取AccessToken: ➜ ~ curl -X POST ApiBoot:ApiBootSecret@localhost:9090/oauth/token\? 注意:获取AccessToken的请求方式为POST.
本章的源码在ApiBoot零代码整合Spring Security的JDBC方式获取AccessToken基础上进行修改,将之前章节源码的application.yml、SystemUser、SystemUserEnhanceMppaer return mapper.findByPhoneAndCode(phone, code); } } 修改用户表结构 我们在ApiBoot零代码整合Spring Security的JDBC方式获取AccessToken 运行测试 将我们的项目运行起来,下面通过CURL的方式尝试获取AccessToken,如下所示: ➜ ~ curl -X POST hengboy:chapter@localhost:9090/oauth refresh_token":"4b1f0ad5-f869-46ca-8b45-0231e69316b3","expires_in":7194,"scope":"api"} 使用postman方式获取AccessToken 敲黑板,划重点 本章根据短信验证码登录的例子来给大家讲解了使用ApiBoot OAuth2怎么进行自定义授权方式来获取AccessToken,例子讲解注重点是在自定义GrantType,在生产使用时还请根据各种情况进行验证
appid":"APPID", "timestamp":TIMESTAMP } } 一般用于,对新注册微信用户的绑定记录,方便我们在自己网站业务中的用户识别操作 2 接口调用凭证 AccessToken https://api.weixin.qq.com/wxa/getwxacodeunlimit'; $query = [ 'access_token' => $this->accessToken
AccessToken 访问令牌是应用程序用来代表用户发出 API 请求的东西。访问令牌代表特定应用程序访问用户数据的特定部分的授权。
来看看OAuth2怎么设置AccessToken有效期时间时长 OAuth2使用Redis来存储客户端信息以及AccessToken 创建项目 我们使用IDEA开发工具创建一个SpringBoot项目, 预计效果是当我们发送获取AccessToken的请求时,会自动将生成的AccessToken存储到Redis。 测试点:携带AccessToken访问接口 我们可以拿着生成的AccessToken来访问在上面添加的测试ApiController内的接口,如下所示: ➜ ~ curl -H 'Authorization 的验证是没有问题的,OAuth2拿着请求携带的AccessToken去Redis验证通过。 如果在生产环境中数据量较大,建议使用Redis集群来解决存储AccessToken的问题。
* @author wangiegie * @date 2015年9月29日下午8:13:06 * @description */ public class Singleton { //缓存accessToken 的Map ,map中包含 一个accessToken 和 缓存的时间戳 //当然也可以分开成两个属性咯 private Map<String, String> map = new HashMap = map.get("access_token"); Long nowDate = new Date().getTime(); //这里设置过期时间 3000*1000就好了 if (accessToken = null && nowDate - Long.parseLong(time) < 3000 * 1000) { result = accessToken; } else { String access_token="这里是直接调用微信的API去直接获取 accessToken 和Jsapi_ticket 获取"; map.put("time", nowDate + ""); map.put
// ⽣成最新的token, key=accessToken ,value=appid baseRedisService.setString(accessToken, appId, timeToken ); // 表数据更新为最新的 accessToken,删除之前的accessToken使⽤ appMapper.updateAccessToken(accessToken , appId); return accessToken; } } 五、添加拦截器AccessTokenInterceptor ,判断请求参数 accessToken 统⼀拦截所有开放接 String accessToken = httpServletRequest.getParameter("accessToken"); // 判断accessToken /从redis 中获取获取到accessToken String appId = (String) baseRedisService.getString(accessToken);
= Convert.FromBase64String(@this);
return Encoding.UTF8.GetString(bytes);
}
获取 AccessToken 参数:
获取AccessToken的方法:
1 ///
第一步:配置 Cesium Ion AccessToken作为一个初学者,我习惯先看看需要什么配置。文档说使用 Cesium 服务需要配置 Cesium Ion AccessToken! 获取 Cesium Ion AccessToken访问 Cesium ion 获取 accessToken在项目中配置全局配置 AccessToken获取 AccessToken 后,在项目的入口处进行配置 : new mapvthree.CesiumTerrainTileProvider({ accessToken: '您的accessToken', // 临时配置 Cesium accessToken 第六步:踩过的坑作为一个初学者,我踩了不少坑,记录下来避免再犯:坑 1:地形不显示原因:没有配置 Cesium Ion AccessToken,或者 AccessToken 配置错误。 坑 4:AccessToken 过期原因:Cesium Ion AccessToken 可能过期。解决:重新获取 AccessToken 并更新配置。
AccessToken JsapiTicket 获取这个两个参数的接口每天都有上线,所以我们应该使用缓存把它们保存起来,减少对这两个接口的调用 示例: /** * 获取access_token = (String) CacheUtils.get("wxCache", "accessToken"); if (StringUtils.isBlank(accessToken) || StringUtils.isEmpty (accessToken)) { String jsonStr = HttpKit.get(ACCESSTOKEN_URL.concat("&appid=") + appId + "&secret =" + appSecret); Map<String, Object> map = JSONObject.parseObject(jsonStr); accessToken = map.get ("access_token").toString(); CacheUtils.put("wxCache", "accessToken", accessToken); } return accessToken