/// <summary> /// 生成oauth uri /// </summary> /// <param name="redirectUri">重定向uri</param> /// <returns></returns> public string OAuthUri(string redirectUri) { PrismParams p = new PrismParams(); p.Add("client_id", this._client.Key); p.Add("redirect_uri", redirectUri); return this._client.Server + "/oauth/authorize?" + p.ToString(); }
//添加签名 public void FixParams(string method, string path, PrismParams parameters , PrismParams headers, PrismParams getParams, PrismParams postParams) { parameters.Add("client_id", this.Key); //http 方法 https方法直接传递 client_secret if (true) { parameters.Add("sign_time", Convert.ToString(this.timestamp())); parameters.Add("sign", this.Sign(path, headers, getParams, postParams, method)); } }
/// <summary> /// RequireOAuth 获取认证凭据 /// e.g. /// { /// "access_token": "xxx", /// "data": { /// "@id": "000000", /// "login": "******", /// "email": "*****@*****.**", /// "firstname": "xxx", /// "lastname": "xxx" /// }, /// "expires_in": xxx, /// "refresh_expires": xxx, /// "refresh_token": "xxx", /// "session_id": "xxx" /// } /// </summary> /// <param name="code">字符串 token提取码 跳转验证登录后返回</param> /// <returns></returns> public string RequireOAuth(string code) { PrismParams parameters = new PrismParams { }; parameters.Add("code", code); parameters.Add("grant_type", "authorization_code"); PrismResponse response = this._client.Post("oauth/token", parameters); JObject ja = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(response.ToString()); if (ja["access_token"] != null) { this._client.OAuthToken = ja["access_token"].ToString(); } return this._client.OAuthToken; }
public void TestOAuth() { /* * 测试 */ string host = "http://192.168.51.50:8080"; string key = "pufy2a7d"; string secret = "skqovukpk2nmdrljphgj"; PrismDotNet prism = new PrismDotNet(host, key, secret); prism.Notify().GetDelivery += OnGetDelivery; PrismParams p = new PrismParams(); p["e"] = "va"; p["c"] = "va"; p["b"] = "vb"; p["0"] = "v0"; PrismResponse rsp = prism.Client().Get("platform/notify/status", p); Console.WriteLine(rsp.RequestId); Console.WriteLine(rsp); Debug.WriteLine(prism.OAuth().OAuthUri("http://www.baidu.com")); }
private PrismResponse action(string method, string api, PrismParams parameters) { try { PrismParams headers = new PrismParams { }; PrismParams getParams = new PrismParams { }; PrismParams postParams = new PrismParams { }; string uristr = this.Server + "/" + api; Uri uri = new Uri(uristr); bool use_query_in_uri = false; switch (method) { case "GET": getParams = parameters; use_query_in_uri = true; break; default: postParams = parameters; break; } this.FixParams(method, uri.AbsolutePath, parameters, headers, getParams, postParams); if (use_query_in_uri) { uristr = uristr + "?" + getParams.ToString(); } HttpWebRequest request = this.CreateRequest(uristr); request.Method = method; if (use_query_in_uri == false) { byte[] postData = postParams.ToBytes(); request.ContentLength = postData.Length; request.ContentType = "application/x-www-form-urlencoded"; using (var dataStream = request.GetRequestStream()) { dataStream.Write(postData, 0, postData.Length); dataStream.Close(); } } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); return new PrismResponse(response); } catch (WebException e) { try { HttpWebResponse response = (HttpWebResponse)e.Response; throw new PrismException(e, response); } catch (PrismException) { throw e; } catch { throw e; } } catch { throw; } }
//处理post请求 public PrismResponse Post(string api, PrismParams parameters) { return this.action("POST", api, parameters); }
//处理get请求 public PrismResponse Get(string api, PrismParams parameters ) { return this.action("GET", api, parameters); }
/// <summary> /// 签名算法 /// </summary> /// <param name="url"> /path/to/method</param> /// <param name="header"> urnencode(HeaderKey1 + HeaderValue1 + HeaderKey2 + HeaderValue2 ...)</param> /// <param name="getParams"> urnencode(GetKey1 + GetValue1 + GetKey2 + GetValue2 ...)</param> /// <param name="postParams"> urnencode(PostKey1 + PostValue1 + PostKey2 + PostValue2 ...)</param> /// <param name="method"> GET | POST | DELETE | PUT</param> /// <returns></returns> private String Sign(string url, PrismParams header, PrismParams getParams, PrismParams postParams, String method) { string uri_path = url; List<string> items = new List<string>(); items.Add(this._secret); items.Add(method); items.Add(PrismParams.Encode(uri_path)); items.Add(PrismParams.Encode(header.sort_join("sign"))); items.Add(PrismParams.Encode(getParams.sort_join("sign"))); items.Add(PrismParams.Encode(postParams.sort_join("sign"))); items.Add(this._secret); string signstr = String.Join("&", items.ToArray()); MD5 md5Hash = MD5.Create(); byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(signstr)); StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("X2")); } return sBuilder.ToString(); }