精华内容
下载资源
问答
  • PostMan自动更新token

    千次阅读 2020-03-03 23:04:05
    参考网页 思路是利用Postman的Tests工具对Get返回的json...在获取access_token的接口中,Tests下输入如下代码: //声明一个变量json,将JSON返回Body里面的值解析并给变量json let json = JSON.parse(responseBod...

    参考网页

    思路是利用Postman的Tests工具对Get返回的json进行提取,保存入全局变量中,在Post的方法中直接调用。

    一、设置PostMan的全局变量

    在这里插入图片描述
    在这里插入图片描述

    二、提取接口返回值

    在获取access_token的接口中,Tests下输入如下代码:

    //声明一个变量json,将JSON返回Body里面的值解析并给变量json
    let json = JSON.parse(responseBody);
    //设置一个断言
    tests["a"] = json.expires_in ===7200;
    //获取json里面的access_token的值给token,运行一次就更新一次,并将token值设置为全局变量
    pm.globals.set("token", json.access_token);
    

    操作如下图所示:

    在这里插入图片描述

    三、将提取到的返回值作为下一个接口的入参

    __引用全局变量格式为 {{token}} __
    操作如下图所示:

    在这里插入图片描述

    四、自动顺序执行

    • 启动测试运行窗口
      在这里插入图片描述

    • 执行
      在这里插入图片描述

    • 结果返回

    在这里插入图片描述

    展开全文
  • 关键字:Memcache access_token 更新 存储 7200本文介绍如何存储及更新 access token的方法。 一、Access Tokenaccess_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_...

    关键字:Memcache access_token 更新 存储 7200

    本文介绍如何存储及更新 access token的方法。

     

    一、Access Token

    access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。

    公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在开发模式中获得(需要已经成为开发者,且帐号没有异常状态)。注意调用所有微信接口时均需使用https协议。

    接口调用请求说明

    http请求方式: GET
    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
    

    参数说明

    参数是否必须说明
    grant_type获取access_token填写client_credential
    appid第三方用户唯一凭证
    secret第三方用户唯一凭证密钥,既appsecret

    返回说明

    正常情况下,微信会返回下述JSON数据包给公众号:

    {"access_token":"ACCESS_TOKEN","expires_in":7200}

     

    三、实现

    `id` int(1) NOT NULL, `type` varchar(20) NOT NULL, `expire` varchar(16) NOT NULL, `value` varchar(600) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `wx_token` (`id`, `type`, `expire`, `value`) VALUES (1, 'access_token', '1425534992', 't3oyW9fRnOWKQHQhZXoEH-pgThhjmnCqTVpaLyUD'), (2, 'jsapi_ticket', '', ''); */ $con = mysql_connect(MYSQLHOST.':'.MYSQLPORT, MYSQLUSER, MYSQLPASSWORD); mysql_select_db(MYSQLDATABASE, $con); $result = mysql_query("SELECT * FROM `wx_token` WHERE `type` = 'access_token'"); while($row = mysql_fetch_array($result)) { $this->access_token = $row['value']; $this->expires_time = $row['expire']; break; } if (time() > ($this->expires_time + 3600)){ $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->appsecret; $res = $this->http_request($url); $result = json_decode($res, true); $this->access_token = $result["access_token"]; $this->expires_time = time(); mysql_query("UPDATE `wx_token` SET `expire` = '$this->expires_time', `value` = '$this->access_token' WHERE `type` = 'access_token';"); } //2. 缓存形式 if (isset($_SERVER['HTTP_APPNAME'])){ //SAE环境,需要开通memcache $mem = memcache_init(); }else { //本地环境,需已安装memcache $mem = new Memcache; $mem->connect('localhost', 11211) or die ("Could not connect"); } $this->access_token = $mem->get($this->appid); if (!isset($this->access_token) || empty($this->access_token)){ $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->appsecret; $res = $this->http_request($url); $result = json_decode($res, true); $this->access_token = $result["access_token"]; $mem->set($this->appid, $this->access_token, 0, 3600); } //3. 本地写入 $res = file_get_contents('access_token.json'); $result = json_decode($res, true); $this->expires_time = $result["expires_time"]; $this->access_token = $result["access_token"]; if (time() > ($this->expires_time + 3600)){ $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->appsecret; $res = $this->http_request($url); $result = json_decode($res, true); $this->access_token = $result["access_token"]; $this->expires_time = time(); file_put_contents('access_token.json', '{"access_token": "'.$this->access_token.'", "expires_time": '.$this->expires_time.'}'); } //4. 实时拉取 $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->appsecret; $res = $this->http_request($url); $result = json_decode($res, true); $this->access_token = $result["access_token"]; $this->expires_time = time(); }
    复制代码
    展开全文
  • PHP生成token自动更新。 在业务中,经常会遇到重复提交问题。token是一种解决表单重复提交的思路,token 原理大致为: 1:显示表单的那个 action 中使用 makeToken() 生成一个随机的 token值,称作 requestToken...

    PHP生成token并自动更新。


    在业务中,经常会遇到重复提交问题。token是一种解决表单重复提交的思路,token 原理大致为:
    1:显示表单的那个 action 中使用 makeToken() 生成一个随机的 token值,称作 requestToken ,并存放在服务端(session或者cache中),并且传递一份到页面中
    2:表单页面使用一个隐藏表单域获取后端传过来的 requestToken 值,该表单页面提交时会将此 requestToken 值一同提交到后端
    3:在表单页面提交 actioin 后,服务端使用 checkToken(requestToken) 来比较服务端刚才下发的原 token 值,如果服务端存在 token 值并且与表单提交过来的值相等,证明是第一次提交。
    4:每次校验过后服务端的 token 值会立即被清除,所以当用户重复提交时,后面的提交校验都再也无法通过。从而实现了防止重复提交的功能,checkToken 是在 synchronized 块中执行的保障了多线程下的安全性。


    直接上代码:

    WebToken.php:

    <?php
    /*
        提供基础的token服务,保存在session,校验后自动更新。
        使用场景:
            提交表单前下发一个token,使用$this->makeToken();
            提交表单的时候,带上这个token;提交后服务器校验此token,$this->checkToken($reqToken);并自动刷新不会重复。

    来源:http://blog.csdn.net/xuduorui/article/details/59108024
    */
    class WebToken {
        const SIGN_KEY      = '-O=M<.`!';
        const SESSION_KEY   = 'ATOKEN';


        protected $token;
        
        function __construct() {
            session_start();
            $this->init();
        }
        
        public function init() {
        }
        
        public function makeToken($expire = 300) {
            $session_id = session_id();
            $time = microtime(true);
            $token = substr(md5($session_id.self::SIGN_KEY .$time), 3, 20);
            $this->saveToSession($token, $expire);
            return $token;
        }
        //验证token并自动刷新token
        public function checkToken($token, $renew=1) {
            // 取出token并作废session
            $tokenInSession = $_SESSION[self::SESSION_KEY];
            unset($_SESSION[self::SESSION_KEY]);
            if ($renew) {
                $this->token = null;//$this->makeToken();
            }
            // 空则返回检查失败
            if (!$tokenInSession) {
                return false;
            }
            
            // 检查session的token是否过期
            if ($tokenInSession['e'] < time()) {
                unset($_SESSION[self::SESSION_KEY]);
                return false;
            }
            // 检查token值
            if (!empty($token) && $tokenInSession['t']==$token) {
                return true;
            }
            return false;
        }

        // 获取token并不刷新
        public function getToken() {
            if (!$this->token) {
                $this->token = $this->makeToken();
            }
            return $this->token;
        }
        protected function saveToSession($token, $expire=300) {
            $value = [
                't' => $token,  //token
                //'c' => time()+$expire, //create_time
                'e' => time()+(int)$expire,
            ];
            $_SESSION[self::SESSION_KEY] = $value;
            //$
            return $value;
        }
    }



    展开全文
  • 问题一次面试遇到的一个问题,其实也是实际开发中很容易遇到的问题,特此记录一下。...这个过程用流程图可以这样表示:自动更新token流程要实现上述需求的话,大家会如何实现呢?首先讲一下Token和Cookie吧-...

    问题

    一次面试遇到的一个问题,其实也是实际开发中很容易遇到的问题,特此记录一下。

    当请求某个接口的时候,我们会在请求的header中携带token消息,但是发现token失效,接口请求报错,怎么马上刷新token,然后重复请求方才那个接口呢?这个过程应该说对用户来说是无感的。

    这个过程用流程图可以这样表示:

    自动更新token流程

    要实现上述需求的话,大家会如何实现呢?

    首先讲一下Token和Cookie吧

    - cookie

    cookie是保存在本地终端的数据。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。

    cookie的组成有:名称(key)、值(value)、有效域(domain)、路径(域的路径,一般设置为全局:"")、失效时间、安全标志(指定后,cookie只有在使用SSL连接时才发送到服务器(https))。

    - token

    token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库。

    解决方案

    通过拦截器,获取返回的数据

    判断token是否过期

    如果token过期则刷新token

    使用最新的token,重新请求网络数据

    自定义自动刷新token的拦截器

    import android.util.Log;

    import java.io.IOException;

    import okhttp3.Interceptor;

    import okhttp3.Request;

    import okhttp3.Response;

    /**

    * 自动刷新token的拦截器

    *

    * @author shijiacheng

    * @version 1.0

    */

    public class TokenInterceptor implements Interceptor {

    private static final String TAG = "TokenInterceptor";

    @Override

    public Response intercept(Chain chain) throws IOException {

    Request request = chain.request();

    Response response = chain.proceed(request);

    Log.d(TAG, "response.code=" + response.code());

    //根据和服务端的约定判断token过期

    if (isTokenExpired(response)) {

    Log.d(TAG, "自动刷新Token,然后重新请求数据");

    //同步请求方式,获取最新的Token

    String newToken = getNewToken();

    //使用新的Token,创建新的请求

    Request newRequest = chain.request()

    .newBuilder()

    .header("Authorization", "Basic " + newToken)

    .build();

    //重新请求

    return chain.proceed(newRequest);

    }

    return response;

    }

    /**

    * 根据Response,判断Token是否失效

    *

    * @param response

    * @return

    */

    private boolean isTokenExpired(Response response) {

    if (response.code() == 301) {

    return true;

    }

    return false;

    }

    /**

    * 同步请求方式,获取最新的Token

    *

    * @return

    */

    private String getNewToken() throws IOException {

    // 通过获取token的接口,同步请求接口

    String newToken = "";

    return newToken;

    }

    }

    配置下OkHttpUtils

    /**

    * 初始化OkHttpUtils

    */

    public OkHttpUtils(){

    /**

    * 配置OkHttpClient

    */

    OkHttpClient client = new OkHttpClient.Builder()

    .connectTimeout(15, TimeUnit.SECONDS)

    .readTimeout(3000, TimeUnit.SECONDS)

    .writeTimeout(3000, TimeUnit.SECONDS)

    // .cache(new Cache())

    // .addInterceptor(interceptor)//这里可以继续添加多种拦截器

    .addInterceptor(new TokenInterceptor())//添加获取token的拦截器

    .build();

    }

    本文作者:shijiacheng

    本文链接: http://shijiacheng.studio/2018/03/28/okhttp-interceptor/

    版权声明:本博客所有文章除特别声明外,均为原创文章。请尊重劳动成果,转载注明出处!

    展开全文
  • 问题一次面试遇到的一个问题,其实也是实际开发中很容易遇到的问题,特此记录一下。...这个过程用流程图可以这样表示:自动更新token流程要实现上述需求的话,大家会如何实现呢?首先讲一下Token和Cookie吧-...
  • 自动更新token流程 要实现上述需求的话,大家会如何实现呢? 首先讲一下Token和Cookie吧 – cookie cookie是保存在本地终端的数据。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的...
  • 问题一次面试遇到的一个问题,其实也是实际开发中很容易遇到的问题,特此记录一下。...这个过程用流程图可以这样表示:自动更新token流程要实现上述需求的话,大家会如何实现呢?首先讲一下Token和Cookie吧-...
  • 问题一次面试遇到的一个问题,其实也是实际开发中很容易遇到的问题,特此记录一下。...这个过程用流程图可以这样表示:自动更新token流程要实现上述需求的话,大家会如何实现呢?首先讲一下Token和Cookie吧-...
  • element-admin这套后端模板用的是模拟数据,token写死了,没提供自动更新token的方案,然而通常我们后端给的token是一段时间内就刷新一次的,所以在这里分享我的解决方案。直接上代码: 1、在拦截器上获取新的token...
  • 关键字:Memcacheaccess_token 更新 存储 7200 本文介绍如何存储及更新 access token的方法。 一、Access Token access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况...
  • 获取AccessTokenAccessToken是企业号的全局唯一票据,调用接口时需携带AccessToken。AccessToken需要用CorpID和Secret来换取,不同的Secret会...access_token至少保留512字节的存储空间。请求说明Https请求方式: GET...
  • springboot 使用redis 实现token自动存储和设定过期时间

    千次阅读 热门讨论 2020-05-09 01:52:28
    使用场景:用户登录系统后,...如果没有问题就更新下redis的这条缓存防止他过期。然后调用到接口 比如:我这里调用一个登录接口:"user/login" 接口 登录成功后,将token存到redis里,然后将 token 返回给前台,让..
  • 利用 Observale 的 retryWhen 的方法,识别 token 过期失效的错误信息,此时发出刷新 token 请求的代码块,完成之后更新 token,这时之前的请求会重新执行,但将它的 token 更新为最新的。另外通过代理类对所有的...
  • 这里是读取test.txt文件的最后一行,并将最后一行的token更新替换。 #!/usr/bin/python # -*- coding: utf-8 -*- def updateToken(token, filePath): readFile = open(filePath) lines = readFile.readlines...
  • 由于Access Token有效期只有7200秒,而每天调用获取的次数只有2000次,所以需要将Access Token进行缓存来保证不触发超过最大调用次数。...下面代码使用缓存来保存Access Token并在3600秒之后自动更新。 1 cl...
  • 在GET请求下,自动检查token的有效性,并对原有的token参数进行替换更新 在POST请求下,自动检查token的有效性,取出FormBody中原有的请求参数,替换原有的token参数 public class OkTokenInterceptor impl...
  • 基于无状态的token刷新机制

    千次阅读 2019-08-14 20:13:32
    如何让用户每次操作页面的时候token自动更新呢?如何避免用户在操作时不会自动token失效呢? 在查阅了很多的资料后,确定了一个比较合适的方法,使用refresh_token机制,而不是使用session和redis这种标识为有状态...
  • 如果我们将access_token的更新定义为作业,在间隔若时间进行更新,那么理论上,SQL服务器中就实现了access_token自动更新。按着这样的思路,第1步要解决的就是SQL的http请求。我们来看实现代码 CREATE PROCEDURE ...
  • 如果我们将access_token的更新定义为作业,在间隔若时间进行更新,那么理论上,SQL服务器中就实现了access_token自动更新。按着这样的思路,第1步要解决的就是SQL的http请求。我们来看实现代码 CREATE PROCEDURE ...
  • 效果展示: token时间续签 ...2:更新登录日期(当前时间new Date()即可)(业务上可选),得到B 3:在redis中缓存key为ACCESS_TOKEN:userId:A(加上A是为了防止用户多个客户端登录 造成token覆盖),value为
  • 获取access_token自动更新access_token $res = file_get_contents('access_token.json'); $result = json_decode($res, true); $this->expires_time = $result["expires_time"]; $this->access_token = $result
  • 首先先做post的接口自动化获取到tokentoken实时更新,所以每次调用需要token的get接口测试都需要post的token接口测试 有人会问了,那这样耦合性不是很高,如果登录测试掉了,那其他接口不是都掉了,是这样,但是...
  • 怎样来更新Token?首先怎样来判断Token失效呢?与后端约定,保存到本地,约定时间到了就判定Token已过期后端返回HTTP Code 401,客户端接到401后判定Token已过期后端返回与客户端约定的自定义Code,客户端接...
  • 每个接口的请求头都需要token信息,token在用户登录时生成,且会不断的变化更新,因此提取token是实现接口自动化的第一步。 测试用例的编写及token基本获取如下: 对应的TextEdit *** Test Cases *** 获取...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 288
精华内容 115
关键字:

token自动更新