裕隆城折扣合作@中興低碳 折扣報表
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

120 рядки
4.0KB

  1. using System.Net;
  2. using System.Text;
  3. using System.Text.Json;
  4. using System.Text.Json.Serialization;
  5. using System.Web;
  6. using LaneFlowReport.Options;
  7. using Microsoft.Extensions.Options;
  8. namespace LaneFlowReport.Auth {
  9. public class ParkingAuthProvider {
  10. private readonly IOptions<OauthOption> _oauthOption;
  11. private readonly IHttpClientFactory _httpClientFactory;
  12. public ParkingAuthProvider(IOptions<OauthOption> oauthOption, IHttpClientFactory httpClientFactory) {
  13. _oauthOption = oauthOption;
  14. _httpClientFactory = httpClientFactory;
  15. }
  16. public const string Name = "Parking";
  17. public async Task<ExternalUserInfoModel> GetUserInfo(string accessCode) {
  18. var providerInfo = new {
  19. _oauthOption.Value.ClientUrl,
  20. _oauthOption.Value.ClientSecret
  21. };
  22. var mode = accessCode.Split(";")?[0];
  23. var key = accessCode.Split(";")?[1];
  24. string url;
  25. object param;
  26. if (mode == "line") {
  27. param = new {
  28. accessToken = providerInfo.ClientSecret,
  29. loginProvider = mode,
  30. providerKey = key,
  31. roleName = "",
  32. };
  33. url = $"{providerInfo.ClientUrl}ExternalRoleOAuth";
  34. }
  35. else {
  36. param = new {
  37. userId = key,
  38. accessToken = providerInfo.ClientSecret
  39. };
  40. url = $"{providerInfo.ClientUrl}ExternalOAuth";
  41. }
  42. var httpClient = _httpClientFactory.CreateClient();
  43. var query = GetQueryString(param);
  44. var content = new StringContent(query, Encoding.UTF8, "application/x-www-form-urlencoded");
  45. var response = await httpClient.PostAsync(url, content);
  46. if (response.StatusCode != HttpStatusCode.OK) {
  47. throw new Exception("Parking Login Error");
  48. }
  49. var responseString = await response.Content.ReadAsStringAsync();
  50. var result = JsonSerializer.Deserialize<AjaxResponse<ExternalUserInfoModel>>(responseString);
  51. if (result?.Result == null) {
  52. throw new Exception("User not exist");
  53. }
  54. return new ExternalUserInfoModel {
  55. FullName = result.Result.FullName,
  56. EmailAddress = result.Result.EmailAddress,
  57. PhotoUrl = result.Result.PhotoUrl,
  58. UserName = result.Result.UserName
  59. };
  60. }
  61. private string GetQueryString(object obj) {
  62. var properties = from p in obj.GetType().GetProperties()
  63. where p.GetValue(obj, null) != null
  64. select p.Name + "=" + HttpUtility.UrlEncode(p.GetValue(obj, null).ToString());
  65. return String.Join("&", properties.ToArray());
  66. }
  67. }
  68. public class ExternalUserInfoModel
  69. {
  70. [JsonPropertyName("tenantId")]
  71. public int TenantId { get; set; }
  72. [JsonPropertyName("id")]
  73. public int Id { get; set; }
  74. [JsonPropertyName("userName")]
  75. public string UserName { get; set; }
  76. [JsonPropertyName("fullName")]
  77. public string FullName { get; set; }
  78. [JsonPropertyName("photoUrl")]
  79. public string PhotoUrl { get; set; }
  80. [JsonPropertyName("emailAddress")]
  81. public string EmailAddress { get; set; }
  82. }
  83. public class AjaxResponse<T>
  84. {
  85. [JsonPropertyName("result")]
  86. public T Result { get; set; }
  87. [JsonPropertyName("targetUrl")]
  88. public object TargetUrl { get; set; }
  89. [JsonPropertyName("success")]
  90. public bool Success { get; set; }
  91. [JsonPropertyName("error")]
  92. public object Error { get; set; }
  93. [JsonPropertyName("unAuthorizedRequest")]
  94. public bool UnAuthorizedRequest { get; set; }
  95. [JsonPropertyName("__abp")]
  96. public bool Abp { get; set; }
  97. }
  98. }