亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

自己開發實現OAuth做webapi認證

2019-11-14 13:50:52
字體:
來源:轉載
供稿:網友

看到園子里面有人寫的OAuth,就想把自己實現的OAuth也分享一下,關于OAuth協議這里就不再贅述。

一、作為認證服務器,首先需要提供一個可以通過appid/appsecret來獲取token這樣的一個接口,于是便有了以下代碼。

    public class AuthController : ApiController    {        [HttpGet]        public HttPResponseMessage Token(string appid = "", string appsecret = "")        {            ApiResponseEntity rep;            var isv = AppManage.Instance.GetAppISV(appid, appsecret);            if (isv != null)            {                string token = TokenManage.Instance.CreateToken(appid);                rep = new ApiResponseEntity                {                    Status = InterfaceStatus.Success,                    BizData = new                    {                        accessToken = token                    }                };            }            else            {                rep = new ApiResponseEntity()                {                    Status = InterfaceStatus.Parm_Missing,                    Message = "param error"                };            }            return rep.ToHttpResponseMessage();        }}
View Code

創建token的算法可以自行實現,我是將新生成的Guid做了一下md5處理,代碼如下:

public string CreateToken(string appid)        {            string token = Guid.NewGuid().ToString().ToMd5();            Set(token, appid);            return token;        }
View Code

上文可以看到,在生成token了以后,就一個SetToken,就是將token存儲在緩存里面,并設置了一定時間的生存周期,代碼如下:

public void Set(string token, string appid)        {            var config = ServerConfigManage.Instance.GetServerConfig();            string key = string.Format(RedisCacheKey.App_Token, token);            RedisNetHelper.Set<string>(key, appid, DateTime.Now.AddSeconds(config.TokenSurvivalTime));        }
View Code

為什么要用token做key,是因為token的變更會導致isv token驗證失效,但是用token做key就可以在存活周期內,這個key都可以使用,避免了多線程獲取token,或是其他原因導致的token失效。作為認證服務器,還需要提供一個RefreshToken這樣的接口,用來給刷新token的存活周期,代碼相似這里就不再贅述。

 

二、在Api做驗證的時候,就需要開始對Token進行驗證了,代碼如下:

 public class OAuthHandler : DelegatingHandler    {        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)        {            ApiResponseEntity repEntity = null;            string appid = "";            string ip = RequestHelper.GetWebClientIp();            if (!OAuthValidate.IpValidate(ip))            {                repEntity = new ApiResponseEntity                {                    Status = InterfaceStatus.IllegalIp,                    Message = "ip access limit"                };            }            else            {                string token = "";                string url = request.RequestUri.AbsoluteUri;                var routeData = request.GetRouteData();                string controller = routeData.Values["controller"].ToString().ToLower();                string action = routeData.Values["action"].ToString().ToLower();                if (controller.Equals("auth") && action.Equals("token"))                {                    return base.SendAsync(request, cancellationToken);                }                if (request.Method == HttpMethod.Get)                {                    var query = request.RequestUri.ParseQueryString();                    token = query["token"];                }                if (token == null || token.Length == 0)                {                    repEntity = new ApiResponseEntity                    {                        Status = InterfaceStatus.Token_Faild,                        Message = "token invalid"                    };                }                else                {                    appid = TokenManage.Instance.Get(token);                    if (appid == null || appid.Length == 0)                    {                        repEntity = new ApiResponseEntity                        {                            Status = InterfaceStatus.Token_Faild,                            Message = "token invalid"                        };                    }                    else                    {                        if (!OAuthValidate.ApiValidate                            (                            string.Format("{0}/{1}", controller, action),                            appid                            ))                        {                            repEntity = new ApiResponseEntity                            {                                Status = InterfaceStatus.No_Access,                                Message = "api access limit"                            };                        }                    }                }            }            if (repEntity != null)            {                var tsc = new TaskCompletionSource<HttpResponseMessage>();                tsc.SetResult(repEntity.ToHttpResponseMessage());                return tsc.Task;            }            else            {                return base.SendAsync(request, cancellationToken);            }        }    }
View Code

使用比較傳統的方式,繼承于DelegatingHandler,然后進行處理,首先是做的IP驗證,然后再進行token有效期驗證,最后再進行Api的權限調用驗證。驗證的代碼如下:

 public static bool IpValidate(string ip)        {            var config = ServerConfigManage.Instance.GetServerConfig();            bool isPass = true;            if (isPass && config.IsStartIpWhiteList)            {                isPass = config.IpWhiteList.Contains(ip);            }            if (isPass && config.IsStartIpBlackList)            {                isPass = !config.IpBlackList.Contains(ip);            }            return isPass;        }        public static bool ApiValidate(string api, string appid)        {            var config = ServerConfigManage.Instance.GetServerConfig();            if (config.IsStartApiControl)            {                var apis = AppManage.Instance.GetAppApiResource(appid);                return apis != null && apis.Contains(api);            }            return true;        }
View Code

GetServerConfig()是從DB/Cache里面獲取服務器的自定義配置,然后看是否開啟ip白名單/黑名單,下面的代碼同理,是否開啟權限驗證。

那認證服務器到這里實際上就結束了,關于isv申請appid/appsecret。然后用戶同意授權以后,存儲appid和user之間的關聯關系,就需要看客自行實現了。

 

另外有一個擴展代碼這里也提一下,就是關于ApiResponseEntity的返回值處理,代碼如下:

public static HttpResponseMessage ToHttpResponseMessage(this ResponseEntity rep, bool isEncrypt = false)        {            return new HttpResponseMessage(HttpStatusCode.OK)            {                Content = new StringContent                    (                    isEncrypt                    ? EncryptHelper.Base64Replace(EncryptHelper.AESEncryptBase64(JsonHelper.ToJson(rep), Config.ApiEncryptKey))                    : JsonHelper.ToJson(rep),                     System.Text.Encoding.UTF8,                    "application/json"                    )            };        }
View Code

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文字幕网站| 色婷婷综合成人| 欧美天天综合色影久久精品| 国产精品高清网站| 国模视频一区二区| 日韩精品在线第一页| 久久的精品视频| 亚洲高清免费观看高清完整版| 爽爽爽爽爽爽爽成人免费观看| 亚洲美女精品成人在线视频| 国产精品色婷婷视频| 欧美激情成人在线视频| 人人澡人人澡人人看欧美| 成人免费激情视频| x99av成人免费| 欧美激情视频三区| 色综合男人天堂| 欧美亚洲在线观看| 欧美一级免费视频| 欧美高清视频在线| 亚洲男人7777| 国精产品一区一区三区有限在线| 91国产精品视频在线| 国产精品网红福利| 日韩在线观看免费全| 亚洲自拍偷拍色图| 国产亚洲欧洲高清| 亚洲午夜久久久久久久| 欧美在线性爱视频| **欧美日韩vr在线| 欧美日韩国产一区二区| 国产www精品| 尤物tv国产一区| 国产精品午夜一区二区欲梦| 欧美视频免费在线观看| 国产亚洲欧美日韩美女| 亚洲第一区中文99精品| 亚洲毛片在线免费观看| 国产精品高潮呻吟久久av野狼| 韩国国内大量揄拍精品视频| 大桥未久av一区二区三区| 欧美日韩亚洲精品一区二区三区| 奇门遁甲1982国语版免费观看高清| 国产精品你懂得| 26uuu久久噜噜噜噜| 久久久久北条麻妃免费看| 欧美激情按摩在线| 亚洲人成电影网站色…| 91久久精品视频| 国产精品激情自拍| 国产精品女主播视频| 亚洲最大av网站| 国产精品wwwwww| 欧美激情videos| 久久免费精品日本久久中文字幕| 国产精品久久久久久久电影| 国产免费亚洲高清| 久久精品91久久久久久再现| 亚洲二区在线播放视频| 欧美午夜xxx| 日韩av理论片| 亚洲一区二区三区乱码aⅴ| 日韩欧美国产成人| 97精品国产91久久久久久| 国产91色在线播放| 97在线免费观看视频| 国内久久久精品| 久久视频在线直播| xxx欧美精品| 亚洲国产日韩欧美在线动漫| 国产丝袜一区二区三区免费视频| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲最新在线视频| 91免费欧美精品| 成人在线国产精品| 国产成人涩涩涩视频在线观看| 国产日韩精品在线| 色婷婷**av毛片一区| 色哟哟网站入口亚洲精品| 国产成人一区二| 国产精品91免费在线| 日韩亚洲综合在线| 成人激情视频免费在线| 日韩专区在线播放| 日韩在线观看精品| 国产mv免费观看入口亚洲| 欧美制服第一页| 亚洲成人激情视频| 国产精品av在线| 欧美丝袜第一区| 亚洲最大成人免费视频| 国产精品成人播放| 亚州精品天堂中文字幕| 欧美激情啊啊啊| 国产一区二区三区在线看| 九九热这里只有精品6| 一本一道久久a久久精品逆3p| 国产精品成人一区二区三区吃奶| 亚洲18私人小影院| 欧美在线欧美在线| 社区色欧美激情 | 欧美激情免费在线| 久久久精品电影| 国产一区在线播放| 亚洲深夜福利视频| 亚洲人成绝费网站色www| 日韩精品一二三四区| 91在线高清免费观看| 日韩av最新在线| 久久免费国产精品1| 91夜夜揉人人捏人人添红杏| 亚洲电影免费观看高清完整版| 夜夜嗨av一区二区三区四区| 亚洲韩国欧洲国产日产av| 热久久99这里有精品| 国产suv精品一区二区三区88区| 精品五月天久久| 91精品国产综合久久香蕉最新版| 国产亚洲欧美日韩美女| 成人精品在线观看| 疯狂做受xxxx高潮欧美日本| 亚洲网站在线看| 日韩视频在线一区| 国产欧美在线看| 亚洲福利影片在线| 91麻豆国产精品| 一区二区三区精品99久久| 亚洲美女免费精品视频在线观看| 亚洲美女久久久| www.久久久久久.com| 自拍亚洲一区欧美另类| 中文日韩在线视频| 久久久久女教师免费一区| 亚洲人成电影在线| 韩国一区二区电影| 97国产一区二区精品久久呦| 亚洲欧洲成视频免费观看| 色综合五月天导航| 欧美国产激情18| 国产日韩视频在线观看| 国产日韩一区在线| 日韩国产在线看| 日韩最新av在线| 国产999精品视频| 亚洲欧美日韩国产精品| 日韩精品在线观看视频| 久久久精品免费| 日韩成人久久久| 国产精品va在线| 成人免费视频在线观看超级碰| 欧美日韩精品在线观看| 亚洲一区久久久| 精品国产自在精品国产浪潮| 国产成人一区二区三区电影| 91在线免费看网站| 亚洲欧洲国产伦综合| 亚洲在线www| 色妞在线综合亚洲欧美| 高清一区二区三区四区五区| 97色在线视频观看| 亚洲一区中文字幕| 97国产一区二区精品久久呦| 夜夜嗨av一区二区三区免费区| 久久色精品视频|