CoreAPIHttpService.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. using Microsoft.Extensions.Configuration;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using Microsoft.Extensions.Options;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Net;
  7. using System.Net.Http;
  8. using System.Net.Http.Json;
  9. using System.Text;
  10. using System.Text.Json;
  11. using System.Threading.Tasks;
  12. using TEAMModelOS.SDK.Extension;
  13. namespace TEAMModelOS.SDK
  14. {
  15. public static class CoreAPIHttpServiceExtensions
  16. {
  17. public static IServiceCollection AddCoreAPIHttpService(this IServiceCollection services, IConfiguration _configuration,string name = "Default")
  18. {
  19. if (services == null) throw new ArgumentNullException(nameof(services));
  20. string location = _configuration.GetValue<string>("Option:Location");
  21. string url = _configuration.GetValue<string>("HaBookAuth:CoreAPI");
  22. var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
  23. var clientSecret = _configuration.GetValue<string>("HaBookAuth:CoreService:clientSecret");
  24. services.AddHttpClient<CoreAPIHttpService>();
  25. services.Configure<CoreAPIHttpServiceOptions>(name , o => { o.location = location;o.url =url;o.clientID = clientID; o.clientSecret = clientSecret; });
  26. return services;
  27. }
  28. }
  29. public class CoreAPIHttpServiceOptions
  30. {
  31. public string location { get; set; }
  32. public string url { get; set; }
  33. public string clientID { get; set; }
  34. public string clientSecret { get; set; }
  35. }
  36. public class CoreAPIHttpService
  37. {
  38. public bool check=true;
  39. private readonly HttpClient _httpClient;
  40. public readonly IOptionsMonitor<CoreAPIHttpServiceOptions> options;
  41. public CoreAPIHttpService(HttpClient httpClient, IOptionsMonitor<CoreAPIHttpServiceOptions> optionsMonitor)
  42. {
  43. _httpClient = httpClient;
  44. options = optionsMonitor;
  45. }
  46. /*
  47. hubName string Optional 指定要傳送到哪個訊息中樞,若沒給則不傳送端外通知,只會發送端內通知。(目前只有"hita"及"hita5"能使用)
  48. sender string Optional 發送訊息的來源端
  49. tags string array Required 接收對象或手機註冊的tag,ID或服務等...
  50. title string Optional 標題,會"直接"顯示於端外通知的title位置
  51. body string Optional 正文,會"直接"顯示於端外通知的body位置
  52. eventId string Optional 事件ID
  53. eventName string Optional 事件名稱
  54. data string Optional 額外資料
  55. */
  56. /// <summary>
  57. /// 發送端內外通知
  58. /// </summary>
  59. /// <param name="clientID"></param>
  60. /// <param name="clientSecret"></param>
  61. /// <param name="location"></param>
  62. /// <param name="url"></param>
  63. /// <param name="data"></param>
  64. /// <returns></returns>
  65. public async Task<(HttpStatusCode code, string content)> PushNotify(Dictionary<string, object> data, string location, IConfiguration _configuration, DI.DingDing _dingDing) {
  66. return (HttpStatusCode.BadRequest, null);
  67. }
  68. /// <summary>
  69. /// 发送短信验证码
  70. /// </summary>
  71. /// <param name="clientID"></param>
  72. /// <param name="clientSecret"></param>
  73. /// <param name="location"></param>
  74. /// <param name="url"></param>
  75. /// <param name="data"></param>
  76. /// <returns></returns>
  77. public async Task<(HttpStatusCode code ,string content)> SendSmsPin(Dictionary<string, object> data, string location, IConfiguration _configuration, DI.DingDing _dingDing)
  78. {
  79. try {
  80. var url = _configuration.GetValue<string>("HaBookAuth:CoreAPI");
  81. //url = "https://api2-rc.teammodel.cn";
  82. url = $"{url}/service/sandsms/pin";
  83. var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
  84. var clientSecret = _configuration.GetValue<string>("HaBookAuth:CoreService:clientSecret");
  85. if (location.Contains("China"))
  86. {
  87. location = "China";
  88. }
  89. else if (location.Contains("Global"))
  90. {
  91. location = "Global";
  92. }
  93. var token = await CoreTokenExtensions.CreateAccessToken(clientID, clientSecret, location);
  94. if (_httpClient.DefaultRequestHeaders.Contains("Authorization"))
  95. {
  96. _httpClient.DefaultRequestHeaders.Remove("Authorization");
  97. }
  98. _httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token.AccessToken}");
  99. HttpResponseMessage responseMessage = await _httpClient.PostAsJsonAsync(url, data);
  100. if (responseMessage.Content != null)
  101. {
  102. string content = await responseMessage.Content.ReadAsStringAsync();
  103. if (!string.IsNullOrWhiteSpace(content))
  104. {
  105. return (responseMessage.StatusCode, content);
  106. }
  107. else {
  108. return (responseMessage.StatusCode, null);
  109. }
  110. }
  111. else {
  112. return (responseMessage.StatusCode, null);
  113. }
  114. } catch (Exception ex) {
  115. await _dingDing.SendBotMsg($"{location}验证码发送异常:\n{ex.Message}\n{ex.StackTrace}", DI.GroupNames.醍摩豆服務運維群組);
  116. return (HttpStatusCode.InternalServerError,null);
  117. }
  118. }
  119. /// <summary>
  120. /// 隐式登录
  121. /// </summary>
  122. /// <param name="clientID"></param>
  123. /// <param name="clientSecret"></param>
  124. /// <param name="location"></param>
  125. /// <param name="url"></param>
  126. /// <param name="data"></param>
  127. /// <returns></returns>
  128. public async Task<TmdidImplicit> Implicit( Dictionary<string,string> data,string location, IConfiguration _configuration)
  129. {
  130. var url = _configuration.GetValue<string>("HaBookAuth:CoreAPI");
  131. //url = "https://api2-rc.teammodel.cn";
  132. url = $"{url}/oauth2/implicit";
  133. var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
  134. var clientSecret = _configuration.GetValue<string>("HaBookAuth:CoreService:clientSecret");
  135. if (location.Contains("China"))
  136. {
  137. location = "China";
  138. }
  139. else if (location.Contains("Global"))
  140. {
  141. location = "Global";
  142. }
  143. var token = await CoreTokenExtensions.CreateAccessToken(clientID, clientSecret, location);
  144. if (_httpClient.DefaultRequestHeaders.Contains("Authorization"))
  145. {
  146. _httpClient.DefaultRequestHeaders.Remove("Authorization");
  147. }
  148. _httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token.AccessToken}");
  149. HttpResponseMessage responseMessage = await _httpClient.PostAsJsonAsync(url, data);
  150. if (responseMessage.StatusCode == HttpStatusCode.OK)
  151. {
  152. string content=await responseMessage.Content.ReadAsStringAsync();
  153. if (!string.IsNullOrEmpty(content))
  154. {
  155. TmdidImplicit tmdidImplicit = content.ToObject<TmdidImplicit>();
  156. return tmdidImplicit;
  157. }
  158. else
  159. {
  160. return null;
  161. }
  162. }
  163. else if (responseMessage.StatusCode == HttpStatusCode.Unauthorized)
  164. {
  165. return null;
  166. }
  167. else
  168. {
  169. return null;
  170. }
  171. }
  172. /// <summary>
  173. /// 获取多个用户信息
  174. /// </summary>
  175. /// <param name="clientID"></param>
  176. /// <param name="clientSecret"></param>
  177. /// <param name="location"></param>
  178. /// <param name="url"></param>
  179. /// <param name="data"></param>
  180. /// <returns></returns>
  181. public async Task<string> GetUserInfos(StringContent scontent, string name = "Default") {
  182. var clientID = options.Get(name).clientID;
  183. var clientSecret = options.Get(name).clientSecret;
  184. var location = options.Get(name).location;
  185. var url = options.Get(name).url;
  186. if (location.Contains("China"))
  187. { url =string.IsNullOrWhiteSpace(url)? "https://api2.teammodel.cn":url;
  188. location = "China";
  189. }
  190. else if (location.Contains("Global"))
  191. {
  192. url = string.IsNullOrWhiteSpace(url) ? "https://api2.teammodel.net" : url;
  193. location = "Global";
  194. }
  195. url = $"{url}/oauth2/getuserinfos";
  196. var token = await CoreTokenExtensions.CreateAccessToken(clientID, clientSecret, location);
  197. if (_httpClient.DefaultRequestHeaders.Contains("Authorization"))
  198. {
  199. _httpClient.DefaultRequestHeaders.Remove("Authorization");
  200. }
  201. _httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token.AccessToken}");
  202. HttpResponseMessage responseMessage = await _httpClient.PostAsync(url, scontent);
  203. if (responseMessage.StatusCode == HttpStatusCode.OK)
  204. {
  205. string content = await responseMessage.Content.ReadAsStringAsync();
  206. if (!string.IsNullOrEmpty(content))
  207. {
  208. return content;
  209. }
  210. else
  211. {
  212. return null;
  213. }
  214. }
  215. else if (responseMessage.StatusCode == HttpStatusCode.Unauthorized)
  216. {
  217. return null;
  218. }
  219. else
  220. {
  221. return null;
  222. }
  223. }
  224. /// <summary>
  225. /// 获取单个用户信息
  226. /// </summary>
  227. /// <param name="clientID"></param>
  228. /// <param name="clientSecret"></param>
  229. /// <param name="location"></param>
  230. /// <param name="url"></param>
  231. /// <param name="data"></param>
  232. /// <returns></returns>
  233. public async Task<CoreUser> GetUserInfo(Dictionary<string, string> data, string location, IConfiguration _configuration)
  234. {
  235. var url = _configuration.GetValue<string>("HaBookAuth:CoreAPI");
  236. //url = "https://api2-rc.teammodel.cn";
  237. url = $"{url}/oauth2/getuserinfo";
  238. var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
  239. var clientSecret = _configuration.GetValue<string>("HaBookAuth:CoreService:clientSecret");
  240. if (location.Contains("China"))
  241. {
  242. location = "China";
  243. }
  244. else if (location.Contains("Global"))
  245. {
  246. location = "Global";
  247. }
  248. var token = await CoreTokenExtensions.CreateAccessToken(clientID, clientSecret, location);
  249. if (_httpClient.DefaultRequestHeaders.Contains("Authorization"))
  250. {
  251. _httpClient.DefaultRequestHeaders.Remove("Authorization");
  252. }
  253. _httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token.AccessToken}");
  254. HttpResponseMessage responseMessage = await _httpClient.PostAsJsonAsync(url, data);
  255. if (responseMessage.StatusCode == HttpStatusCode.OK)
  256. {
  257. string content = await responseMessage.Content.ReadAsStringAsync();
  258. if (!string.IsNullOrEmpty(content))
  259. {
  260. CoreUserInfo coreUserInfo = content.ToObject<CoreUserInfo>();
  261. if (coreUserInfo != null)
  262. {
  263. bool isActivate = !string.IsNullOrWhiteSpace(coreUserInfo.password) || !string.IsNullOrWhiteSpace(coreUserInfo.passwordOld);
  264. CoreUser coreUser = new CoreUser
  265. {
  266. isActivate = isActivate,
  267. id = coreUserInfo.id,
  268. vid = coreUserInfo.vid,
  269. mail = coreUserInfo.mail,
  270. mobile = coreUserInfo.mobile,
  271. name = coreUserInfo.name,
  272. picture = coreUserInfo.picture,
  273. habook = coreUserInfo.habook,
  274. wechat = coreUserInfo.wechat,
  275. facebook = coreUserInfo.facebook,
  276. google = coreUserInfo.google,
  277. ding = coreUserInfo.ding,
  278. apple = coreUserInfo.apple,
  279. };
  280. return coreUser;
  281. }
  282. else
  283. {
  284. return null;
  285. }
  286. }
  287. else {
  288. return null;
  289. }
  290. }
  291. else if (responseMessage.StatusCode == HttpStatusCode.Unauthorized)
  292. {
  293. return null;
  294. }
  295. else
  296. {
  297. return null;
  298. }
  299. }
  300. }
  301. public class TmdidImplicit
  302. {
  303. public string id_token { get; set; }
  304. public string access_token { get; set; }
  305. public string expires_in { get; set; }
  306. public string token_type { get; set; }
  307. }
  308. public class CoreUser
  309. {
  310. public string searchKey { get; set; }
  311. public string id { get; set; }
  312. public string vid { get; set; }
  313. public string mail { get; set; }
  314. public string mobile { get; set; }
  315. public string name { get; set; }
  316. public string picture { get; set; }
  317. public string habook { get; set; }
  318. public string wechat { get; set; }
  319. public string facebook { get; set; }
  320. public string google { get; set; }
  321. public string ding { get; set; }
  322. public string apple { get; set; }
  323. public bool isActivate { get; set; }
  324. }
  325. public class CoreUserInfo : CoreUser
  326. {
  327. public string area { get; set; }
  328. public string country { get; set; }
  329. public string type { get; set; }
  330. public string password { get; set; }
  331. public string salt { get; set; }
  332. public string passwordOld { get; set; }
  333. public string saltOld { get; set; }
  334. }
  335. }