zoukankan      html  css  js  c++  java
  • View and Data API tips: 缓存Access Token

    对于云API服务,常见的方式就是按照API调用次数收费,某些API调用也就有某些限制,比如在特定时间内只允许调用指定的次数以免造成滥用。虽然Autodesk的view and Data API目前还没有应用这样的限制,但我们最好也能实现这样的机制,比如对于或者Access Token这样的操作,一个Access Token是有一定的有效期的,在这个token的有效期内,我们就没必要重复发出API调用获取新的Acces Token,只有返回仍然有效的token就可以了。下面是c#实现的简单的逻辑,用一个全局静态变量来缓存Access Token:

    public class Util
    {
        private static readonly ILog logger = LogManager.GetLogger(typeof(Util));

        string baseUrl = "";
        RestClient m_client;


        public static AccessToken token;
        public static DateTime issueDateTime;
        //refresh token if the token is about to expire in 5 seconds
        public static int ABOUT_EXPIRED_SECONDS = 5;


        public Util(string baseUrl)
        {
            this.baseUrl = baseUrl;
            m_client = new RestClient(baseUrl);
        }

        public AccessToken GetAccessToken(string clientId, string clientSecret)
        {
            //no token or token is going to be expired
            // (less than ABOUT_EXPIRED_SECONDS)

            if (token == null
                || (DateTime.Now - issueDateTime).TotalSeconds
                    > (token.expires_in - ABOUT_EXPIRED_SECONDS))
            {
                RestRequest req = new RestRequest();
                req.Resource = "authentication/v1/authenticate";
                req.Method = Method.POST;
                req.AddHeader("Content-Type", "application/x-www-form-urlencoded");
                req.AddParameter("client_id", clientId);
                req.AddParameter("client_secret", clientSecret);
                req.AddParameter("grant_type", "client_credentials");
                //avoid CORS issue, do not use this if you just need to get access token from same domain

                req.AddHeader("Access-Control-Allow-Origin", "*");

                IRestResponse<AccessToken> resp = m_client.Execute<AccessToken>(req);
                logger.Debug(resp.Content);

                if (resp.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    AccessToken ar = resp.Data;
                    if (ar != null)
                    {
                        token = ar;

                        //update the token issue time
                        issueDateTime = DateTime.Now;


                    }
                }
                else
                {

                    logger.Fatal("Authentication failed! clientId:" + clientId);

                }

            }
            else
            {
                ;//Do nothing, use the saved access token in static var
            }

            return token;
        }


        }

     

    当然,根据需要你可以选择其他的方式,比如把token保存在数据库中,或者memcache中。

  • 相关阅读:
    系统架构设计师软考总结
    统一用户认证系统CUAS实现要点
    Activiti使用总结
    性能优化总结篇
    CVE-2016-5734-phpmyadmin-4.0.x-4.6.2-代码执行
    WooYun-2016-199433 -phpmyadmin-反序列化-getshell
    CVE-2015-1635-HTTP.SYS远程执行代码
    泛微OA 多版本存在命令执行
    CVE-2019-20372-Nginx error_page 请求走私
    通达OA 页面敏感信息-2013/2015版本
  • 原文地址:https://www.cnblogs.com/junqilian/p/4299981.html
Copyright © 2011-2022 走看看