authing_ruby 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (462) hide show
  1. checksums.yaml +4 -4
  2. data/authing_ruby.gemspec +4 -2
  3. data/lib/authing_ruby/common/PublicKeyManager.rb +12 -1
  4. data/lib/authing_ruby/version.rb +1 -1
  5. metadata +10 -467
  6. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/CONTRIBUTION.md +0 -23
  7. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/LICENSE +0 -21
  8. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/README.md +0 -303
  9. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build-doc.js +0 -520
  10. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/browser/index.min.js +0 -2
  11. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/browser/index.min.js.LICENSE.txt +0 -91
  12. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/index.d.ts +0 -7
  13. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/index.js +0 -20
  14. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/AuthenticationClient.d.ts +0 -1118
  15. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/AuthenticationClient.js +0 -2859
  16. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/AuthenticationTokenProvider.d.ts +0 -13
  17. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/AuthenticationTokenProvider.js +0 -56
  18. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/BaseAuthenticationClient.d.ts +0 -6
  19. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/BaseAuthenticationClient.js +0 -31
  20. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/EnterpriseAuthenticationClient.d.ts +0 -92
  21. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/EnterpriseAuthenticationClient.js +0 -250
  22. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/MfaAuthenticationClient.d.ts +0 -303
  23. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/MfaAuthenticationClient.js +0 -665
  24. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/QrCodeAuthenticationClient.d.ts +0 -232
  25. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/QrCodeAuthenticationClient.js +0 -622
  26. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/SocialAuthenticationClient.d.ts +0 -104
  27. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/SocialAuthenticationClient.js +0 -180
  28. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/types.d.ts +0 -341
  29. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/authentication/types.js +0 -69
  30. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/common/GraphqlClient.d.ts +0 -14
  31. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/common/GraphqlClient.js +0 -127
  32. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/common/HttpClient.d.ts +0 -19
  33. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/common/HttpClient.js +0 -151
  34. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/common/PublicKeyManager.d.ts +0 -18
  35. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/common/PublicKeyManager.js +0 -81
  36. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/graphqlapi.d.ts +0 -121
  37. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/graphqlapi.js +0 -2002
  38. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/AclManagementClient.d.ts +0 -236
  39. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/AclManagementClient.js +0 -863
  40. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/AgreementManagementClient.d.ts +0 -65
  41. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/AgreementManagementClient.js +0 -195
  42. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/ApplicationsManagementClient.d.ts +0 -216
  43. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/ApplicationsManagementClient.js +0 -533
  44. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/GroupsManagementClient.d.ts +0 -188
  45. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/GroupsManagementClient.js +0 -404
  46. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/MFAManagementClient.d.ts +0 -58
  47. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/MFAManagementClient.js +0 -126
  48. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/ManagementClient.d.ts +0 -79
  49. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/ManagementClient.js +0 -203
  50. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/ManagementTokenProvider.d.ts +0 -39
  51. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/ManagementTokenProvider.js +0 -159
  52. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/OrgManagementClient.d.ts +0 -521
  53. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/OrgManagementClient.js +0 -840
  54. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/PoliciesManagementClient.d.ts +0 -304
  55. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/PoliciesManagementClient.js +0 -512
  56. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/RolesManagementClient.d.ts +0 -296
  57. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/RolesManagementClient.js +0 -711
  58. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/StatisticsManagementClient.d.ts +0 -56
  59. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/StatisticsManagementClient.js +0 -198
  60. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/UdfManagementClient.d.ts +0 -146
  61. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/UdfManagementClient.js +0 -264
  62. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/UserActionManagementClient.d.ts +0 -44
  63. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/UserActionManagementClient.js +0 -106
  64. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/UserpoolManagementClient.d.ts +0 -142
  65. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/UserpoolManagementClient.js +0 -241
  66. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/UsersManagementClient.d.ts +0 -784
  67. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/UsersManagementClient.js +0 -1251
  68. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/WhitelistManagementClient.d.ts +0 -114
  69. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/WhitelistManagementClient.js +0 -259
  70. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/types.d.ts +0 -992
  71. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/management/types.js +0 -96
  72. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/platform/express/index.d.ts +0 -30
  73. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/platform/express/index.js +0 -126
  74. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/testing-helper.d.ts +0 -31
  75. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/testing-helper.js +0 -67
  76. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/utils.d.ts +0 -53
  77. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/utils.js +0 -343
  78. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/version.d.ts +0 -1
  79. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/lib/version.js +0 -5
  80. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/types/graphql.v2.d.ts +0 -6241
  81. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/types/graphql.v2.js +0 -251
  82. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/types/index.d.ts +0 -7
  83. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/main/types/index.js +0 -3
  84. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/index.d.ts +0 -7
  85. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/index.js +0 -8
  86. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/AuthenticationClient.d.ts +0 -1118
  87. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/AuthenticationClient.js +0 -2853
  88. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/AuthenticationTokenProvider.d.ts +0 -13
  89. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/AuthenticationTokenProvider.js +0 -53
  90. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/BaseAuthenticationClient.d.ts +0 -6
  91. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/BaseAuthenticationClient.js +0 -28
  92. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/EnterpriseAuthenticationClient.d.ts +0 -92
  93. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/EnterpriseAuthenticationClient.js +0 -247
  94. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/MfaAuthenticationClient.d.ts +0 -303
  95. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/MfaAuthenticationClient.js +0 -662
  96. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/QrCodeAuthenticationClient.d.ts +0 -232
  97. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/QrCodeAuthenticationClient.js +0 -619
  98. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/SocialAuthenticationClient.d.ts +0 -104
  99. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/SocialAuthenticationClient.js +0 -177
  100. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/types.d.ts +0 -341
  101. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/authentication/types.js +0 -66
  102. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/common/GraphqlClient.d.ts +0 -14
  103. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/common/GraphqlClient.js +0 -121
  104. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/common/HttpClient.d.ts +0 -19
  105. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/common/HttpClient.js +0 -145
  106. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/common/PublicKeyManager.d.ts +0 -18
  107. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/common/PublicKeyManager.js +0 -78
  108. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/graphqlapi.d.ts +0 -121
  109. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/graphqlapi.js +0 -1999
  110. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/AclManagementClient.d.ts +0 -236
  111. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/AclManagementClient.js +0 -860
  112. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/AgreementManagementClient.d.ts +0 -65
  113. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/AgreementManagementClient.js +0 -192
  114. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/ApplicationsManagementClient.d.ts +0 -216
  115. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/ApplicationsManagementClient.js +0 -530
  116. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/GroupsManagementClient.d.ts +0 -188
  117. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/GroupsManagementClient.js +0 -401
  118. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/MFAManagementClient.d.ts +0 -58
  119. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/MFAManagementClient.js +0 -123
  120. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/ManagementClient.d.ts +0 -79
  121. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/ManagementClient.js +0 -197
  122. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/ManagementTokenProvider.d.ts +0 -39
  123. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/ManagementTokenProvider.js +0 -153
  124. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/OrgManagementClient.d.ts +0 -521
  125. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/OrgManagementClient.js +0 -818
  126. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/PoliciesManagementClient.d.ts +0 -304
  127. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/PoliciesManagementClient.js +0 -509
  128. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/RolesManagementClient.d.ts +0 -296
  129. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/RolesManagementClient.js +0 -708
  130. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/StatisticsManagementClient.d.ts +0 -56
  131. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/StatisticsManagementClient.js +0 -195
  132. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/UdfManagementClient.d.ts +0 -146
  133. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/UdfManagementClient.js +0 -261
  134. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/UserActionManagementClient.d.ts +0 -44
  135. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/UserActionManagementClient.js +0 -103
  136. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/UserpoolManagementClient.d.ts +0 -142
  137. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/UserpoolManagementClient.js +0 -238
  138. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/UsersManagementClient.d.ts +0 -784
  139. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/UsersManagementClient.js +0 -1248
  140. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/WhitelistManagementClient.d.ts +0 -114
  141. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/WhitelistManagementClient.js +0 -256
  142. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/types.d.ts +0 -992
  143. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/management/types.js +0 -93
  144. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/platform/express/index.d.ts +0 -30
  145. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/platform/express/index.js +0 -123
  146. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/testing-helper.d.ts +0 -31
  147. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/testing-helper.js +0 -62
  148. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/utils.d.ts +0 -53
  149. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/utils.js +0 -336
  150. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/version.d.ts +0 -1
  151. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/lib/version.js +0 -2
  152. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/types/graphql.v2.d.ts +0 -6241
  153. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/types/graphql.v2.js +0 -248
  154. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/types/index.d.ts +0 -7
  155. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/module/types/index.js +0 -1
  156. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/index.d.ts +0 -7
  157. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/index.js +0 -30
  158. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/AuthenticationClient.d.ts +0 -1118
  159. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/AuthenticationClient.js +0 -2869
  160. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/AuthenticationTokenProvider.d.ts +0 -13
  161. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/AuthenticationTokenProvider.js +0 -66
  162. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/BaseAuthenticationClient.d.ts +0 -6
  163. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/BaseAuthenticationClient.js +0 -41
  164. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/EnterpriseAuthenticationClient.d.ts +0 -92
  165. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/EnterpriseAuthenticationClient.js +0 -260
  166. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/MfaAuthenticationClient.d.ts +0 -303
  167. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/MfaAuthenticationClient.js +0 -675
  168. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/QrCodeAuthenticationClient.d.ts +0 -232
  169. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/QrCodeAuthenticationClient.js +0 -632
  170. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/SocialAuthenticationClient.d.ts +0 -104
  171. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/SocialAuthenticationClient.js +0 -190
  172. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/types.d.ts +0 -341
  173. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/authentication/types.js +0 -79
  174. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/common/GraphqlClient.d.ts +0 -14
  175. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/common/GraphqlClient.js +0 -137
  176. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/common/HttpClient.d.ts +0 -19
  177. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/common/HttpClient.js +0 -161
  178. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/common/PublicKeyManager.d.ts +0 -18
  179. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/common/PublicKeyManager.js +0 -91
  180. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/graphqlapi.d.ts +0 -121
  181. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/graphqlapi.js +0 -2012
  182. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/AclManagementClient.d.ts +0 -236
  183. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/AclManagementClient.js +0 -873
  184. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/AgreementManagementClient.d.ts +0 -65
  185. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/AgreementManagementClient.js +0 -205
  186. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/ApplicationsManagementClient.d.ts +0 -216
  187. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/ApplicationsManagementClient.js +0 -543
  188. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/GroupsManagementClient.d.ts +0 -188
  189. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/GroupsManagementClient.js +0 -414
  190. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/MFAManagementClient.d.ts +0 -58
  191. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/MFAManagementClient.js +0 -136
  192. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/ManagementClient.d.ts +0 -79
  193. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/ManagementClient.js +0 -213
  194. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/ManagementTokenProvider.d.ts +0 -39
  195. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/ManagementTokenProvider.js +0 -169
  196. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/OrgManagementClient.d.ts +0 -521
  197. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/OrgManagementClient.js +0 -850
  198. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/PoliciesManagementClient.d.ts +0 -304
  199. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/PoliciesManagementClient.js +0 -522
  200. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/RolesManagementClient.d.ts +0 -296
  201. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/RolesManagementClient.js +0 -721
  202. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/StatisticsManagementClient.d.ts +0 -56
  203. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/StatisticsManagementClient.js +0 -208
  204. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/UdfManagementClient.d.ts +0 -146
  205. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/UdfManagementClient.js +0 -274
  206. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/UserActionManagementClient.d.ts +0 -44
  207. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/UserActionManagementClient.js +0 -116
  208. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/UserpoolManagementClient.d.ts +0 -142
  209. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/UserpoolManagementClient.js +0 -251
  210. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/UsersManagementClient.d.ts +0 -784
  211. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/UsersManagementClient.js +0 -1261
  212. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/WhitelistManagementClient.d.ts +0 -114
  213. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/WhitelistManagementClient.js +0 -269
  214. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/types.d.ts +0 -992
  215. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/management/types.js +0 -106
  216. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/platform/express/index.d.ts +0 -30
  217. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/platform/express/index.js +0 -136
  218. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/testing-helper.d.ts +0 -31
  219. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/testing-helper.js +0 -77
  220. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/utils.d.ts +0 -53
  221. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/utils.js +0 -353
  222. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/version.d.ts +0 -1
  223. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/lib/version.js +0 -15
  224. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/types/graphql.v2.d.ts +0 -6241
  225. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/types/graphql.v2.js +0 -261
  226. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/types/index.d.ts +0 -7
  227. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/build/umd/types/index.js +0 -13
  228. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/CHANGELOG.md +0 -413
  229. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/LICENSE +0 -19
  230. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/README.md +0 -709
  231. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/UPGRADE_GUIDE.md +0 -162
  232. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/dist/axios.js +0 -1715
  233. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/dist/axios.map +0 -1
  234. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/dist/axios.min.js +0 -3
  235. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/dist/axios.min.map +0 -1
  236. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/index.d.ts +0 -157
  237. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/index.js +0 -1
  238. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/adapters/README.md +0 -37
  239. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/adapters/http.js +0 -279
  240. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/adapters/xhr.js +0 -180
  241. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/axios.js +0 -53
  242. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/cancel/Cancel.js +0 -19
  243. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/cancel/CancelToken.js +0 -57
  244. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/cancel/isCancel.js +0 -5
  245. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/core/Axios.js +0 -94
  246. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/core/InterceptorManager.js +0 -52
  247. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/core/README.md +0 -7
  248. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/core/buildFullPath.js +0 -20
  249. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/core/createError.js +0 -18
  250. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/core/dispatchRequest.js +0 -79
  251. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/core/enhanceError.js +0 -42
  252. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/core/mergeConfig.js +0 -73
  253. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/core/settle.js +0 -25
  254. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/core/transformData.js +0 -20
  255. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/defaults.js +0 -97
  256. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/helpers/README.md +0 -7
  257. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/helpers/bind.js +0 -11
  258. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/helpers/buildURL.js +0 -71
  259. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/helpers/combineURLs.js +0 -14
  260. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/helpers/cookies.js +0 -53
  261. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/helpers/deprecatedMethod.js +0 -24
  262. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/helpers/isAbsoluteURL.js +0 -14
  263. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/helpers/isURLSameOrigin.js +0 -68
  264. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/helpers/normalizeHeaderName.js +0 -12
  265. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/helpers/parseHeaders.js +0 -53
  266. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/helpers/spread.js +0 -27
  267. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/lib/utils.js +0 -344
  268. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/axios/package.json +0 -84
  269. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/follow-redirects/LICENSE +0 -18
  270. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/follow-redirects/README.md +0 -155
  271. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/follow-redirects/http.js +0 -1
  272. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/follow-redirects/https.js +0 -1
  273. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/follow-redirects/index.js +0 -322
  274. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/node_modules/follow-redirects/package.json +0 -60
  275. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/package.json +0 -129
  276. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/tests/index.html +0 -21
  277. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/tsconfig.brower.json +0 -45
  278. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/tsconfig.node.json +0 -0
  279. data/lib/authing_ruby/test/js_sdk_test/node_modules/authing-js-sdk/webpack.config.js +0 -41
  280. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/CHANGELOG.md +0 -685
  281. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/LICENSE +0 -19
  282. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/README.md +0 -800
  283. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/UPGRADE_GUIDE.md +0 -162
  284. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/dist/axios.js +0 -1756
  285. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/dist/axios.map +0 -1
  286. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/dist/axios.min.js +0 -3
  287. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/dist/axios.min.map +0 -1
  288. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/index.d.ts +0 -161
  289. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/index.js +0 -1
  290. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/adapters/README.md +0 -37
  291. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/adapters/http.js +0 -303
  292. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/adapters/xhr.js +0 -179
  293. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/axios.js +0 -56
  294. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/cancel/Cancel.js +0 -19
  295. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/cancel/CancelToken.js +0 -57
  296. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/cancel/isCancel.js +0 -5
  297. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/core/Axios.js +0 -95
  298. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/core/InterceptorManager.js +0 -52
  299. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/core/README.md +0 -7
  300. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/core/buildFullPath.js +0 -20
  301. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/core/createError.js +0 -18
  302. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/core/dispatchRequest.js +0 -79
  303. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/core/enhanceError.js +0 -42
  304. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/core/mergeConfig.js +0 -87
  305. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/core/settle.js +0 -25
  306. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/core/transformData.js +0 -20
  307. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/defaults.js +0 -98
  308. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/helpers/README.md +0 -7
  309. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/helpers/bind.js +0 -11
  310. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/helpers/buildURL.js +0 -70
  311. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/helpers/combineURLs.js +0 -14
  312. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/helpers/cookies.js +0 -53
  313. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/helpers/deprecatedMethod.js +0 -24
  314. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/helpers/isAbsoluteURL.js +0 -14
  315. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/helpers/isAxiosError.js +0 -11
  316. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/helpers/isURLSameOrigin.js +0 -68
  317. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/helpers/normalizeHeaderName.js +0 -12
  318. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/helpers/parseHeaders.js +0 -53
  319. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/helpers/spread.js +0 -27
  320. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/lib/utils.js +0 -351
  321. data/lib/authing_ruby/test/js_sdk_test/node_modules/axios/package.json +0 -86
  322. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/CONTRIBUTING.md +0 -28
  323. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/LICENSE +0 -24
  324. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/README.md +0 -249
  325. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/aes.js +0 -234
  326. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/bower.json +0 -35
  327. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/cipher-core.js +0 -890
  328. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/core.js +0 -797
  329. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/crypto-js.js +0 -6059
  330. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/docs/QuickStartGuide.wiki +0 -470
  331. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/enc-base64.js +0 -136
  332. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/enc-hex.js +0 -18
  333. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/enc-latin1.js +0 -18
  334. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/enc-utf16.js +0 -149
  335. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/enc-utf8.js +0 -18
  336. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/evpkdf.js +0 -134
  337. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/format-hex.js +0 -66
  338. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/format-openssl.js +0 -18
  339. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/hmac-md5.js +0 -18
  340. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/hmac-ripemd160.js +0 -18
  341. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/hmac-sha1.js +0 -18
  342. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/hmac-sha224.js +0 -18
  343. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/hmac-sha256.js +0 -18
  344. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/hmac-sha3.js +0 -18
  345. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/hmac-sha384.js +0 -18
  346. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/hmac-sha512.js +0 -18
  347. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/hmac.js +0 -143
  348. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/index.js +0 -18
  349. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/lib-typedarrays.js +0 -76
  350. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/md5.js +0 -268
  351. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/mode-cfb.js +0 -80
  352. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/mode-ctr-gladman.js +0 -116
  353. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/mode-ctr.js +0 -58
  354. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/mode-ecb.js +0 -40
  355. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/mode-ofb.js +0 -54
  356. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/package.json +0 -38
  357. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/pad-ansix923.js +0 -49
  358. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/pad-iso10126.js +0 -44
  359. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/pad-iso97971.js +0 -40
  360. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/pad-nopadding.js +0 -30
  361. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/pad-pkcs7.js +0 -18
  362. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/pad-zeropadding.js +0 -47
  363. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/pbkdf2.js +0 -145
  364. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/rabbit-legacy.js +0 -190
  365. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/rabbit.js +0 -192
  366. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/rc4.js +0 -139
  367. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/ripemd160.js +0 -267
  368. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/sha1.js +0 -150
  369. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/sha224.js +0 -80
  370. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/sha256.js +0 -199
  371. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/sha3.js +0 -326
  372. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/sha384.js +0 -83
  373. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/sha512.js +0 -326
  374. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/tripledes.js +0 -779
  375. data/lib/authing_ruby/test/js_sdk_test/node_modules/crypto-js/x64-core.js +0 -304
  376. data/lib/authing_ruby/test/js_sdk_test/node_modules/debug/CHANGELOG.md +0 -395
  377. data/lib/authing_ruby/test/js_sdk_test/node_modules/debug/LICENSE +0 -19
  378. data/lib/authing_ruby/test/js_sdk_test/node_modules/debug/Makefile +0 -58
  379. data/lib/authing_ruby/test/js_sdk_test/node_modules/debug/README.md +0 -368
  380. data/lib/authing_ruby/test/js_sdk_test/node_modules/debug/karma.conf.js +0 -70
  381. data/lib/authing_ruby/test/js_sdk_test/node_modules/debug/node.js +0 -1
  382. data/lib/authing_ruby/test/js_sdk_test/node_modules/debug/package.json +0 -43
  383. data/lib/authing_ruby/test/js_sdk_test/node_modules/debug/src/browser.js +0 -195
  384. data/lib/authing_ruby/test/js_sdk_test/node_modules/debug/src/debug.js +0 -225
  385. data/lib/authing_ruby/test/js_sdk_test/node_modules/debug/src/index.js +0 -10
  386. data/lib/authing_ruby/test/js_sdk_test/node_modules/debug/src/node.js +0 -186
  387. data/lib/authing_ruby/test/js_sdk_test/node_modules/dotenv/CHANGELOG.md +0 -210
  388. data/lib/authing_ruby/test/js_sdk_test/node_modules/dotenv/LICENSE +0 -23
  389. data/lib/authing_ruby/test/js_sdk_test/node_modules/dotenv/README.md +0 -275
  390. data/lib/authing_ruby/test/js_sdk_test/node_modules/dotenv/config.js +0 -11
  391. data/lib/authing_ruby/test/js_sdk_test/node_modules/dotenv/lib/cli-options.js +0 -13
  392. data/lib/authing_ruby/test/js_sdk_test/node_modules/dotenv/lib/env-options.js +0 -18
  393. data/lib/authing_ruby/test/js_sdk_test/node_modules/dotenv/lib/main.js +0 -118
  394. data/lib/authing_ruby/test/js_sdk_test/node_modules/dotenv/package.json +0 -57
  395. data/lib/authing_ruby/test/js_sdk_test/node_modules/dotenv/types/index.d.ts +0 -59
  396. data/lib/authing_ruby/test/js_sdk_test/node_modules/dotenv/types/test.ts +0 -19
  397. data/lib/authing_ruby/test/js_sdk_test/node_modules/dotenv/types/tsconfig.json +0 -15
  398. data/lib/authing_ruby/test/js_sdk_test/node_modules/dotenv/types/tslint.json +0 -6
  399. data/lib/authing_ruby/test/js_sdk_test/node_modules/follow-redirects/LICENSE +0 -18
  400. data/lib/authing_ruby/test/js_sdk_test/node_modules/follow-redirects/README.md +0 -148
  401. data/lib/authing_ruby/test/js_sdk_test/node_modules/follow-redirects/debug.js +0 -14
  402. data/lib/authing_ruby/test/js_sdk_test/node_modules/follow-redirects/http.js +0 -1
  403. data/lib/authing_ruby/test/js_sdk_test/node_modules/follow-redirects/https.js +0 -1
  404. data/lib/authing_ruby/test/js_sdk_test/node_modules/follow-redirects/index.js +0 -531
  405. data/lib/authing_ruby/test/js_sdk_test/node_modules/follow-redirects/package.json +0 -59
  406. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/LICENSE.txt +0 -107
  407. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/README.md +0 -192
  408. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/bin/jsencrypt.js +0 -249
  409. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/bin/jsencrypt.min.js +0 -2
  410. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/bin/jsencrypt.min.js.LICENSE.txt +0 -8
  411. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/JSEncrypt.d.ts +0 -116
  412. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/JSEncrypt.js +0 -186
  413. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/JSEncryptRSAKey.d.ts +0 -142
  414. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/JSEncryptRSAKey.js +0 -315
  415. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/index.d.ts +0 -3
  416. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/index.js +0 -3
  417. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/asn1js/asn1.d.ts +0 -51
  418. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/asn1js/asn1.js +0 -565
  419. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/asn1js/base64.d.ts +0 -5
  420. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/asn1js/base64.js +0 -88
  421. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/asn1js/hex.d.ts +0 -3
  422. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/asn1js/hex.js +0 -64
  423. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/asn1js/int10.d.ts +0 -9
  424. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/asn1js/int10.js +0 -87
  425. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/asn1js/oids.d.ts +0 -9778
  426. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/asn1js/oids.js +0 -1962
  427. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsbn/base64.d.ts +0 -3
  428. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsbn/base64.js +0 -76
  429. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsbn/jsbn.d.ts +0 -98
  430. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsbn/jsbn.js +0 -1754
  431. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsbn/prng4.d.ts +0 -10
  432. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsbn/prng4.js +0 -46
  433. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsbn/rng.d.ts +0 -3
  434. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsbn/rng.js +0 -76
  435. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsbn/rsa.d.ts +0 -23
  436. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsbn/rsa.js +0 -373
  437. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsbn/util.d.ts +0 -7
  438. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsbn/util.js +0 -58
  439. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsrsasign/asn1-1.0.js +0 -1593
  440. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/lib/jsrsasign/yahoo.js +0 -69
  441. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/lib/version.json +0 -1
  442. data/lib/authing_ruby/test/js_sdk_test/node_modules/jsencrypt/package.json +0 -49
  443. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/Gruntfile.js +0 -78
  444. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/LICENSE +0 -21
  445. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/README.md +0 -55
  446. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/bower.json +0 -20
  447. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/build/jwt-decode.js +0 -125
  448. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/build/jwt-decode.min.js +0 -1
  449. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/jwt-decode.html +0 -2
  450. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/lib/atob.js +0 -38
  451. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/lib/base64_url_decode.js +0 -33
  452. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/lib/index.js +0 -26
  453. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/package.json +0 -37
  454. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/standalone.js +0 -16
  455. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/test/tests.js +0 -53
  456. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/test_harness.html +0 -29
  457. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/testem.yml +0 -46
  458. data/lib/authing_ruby/test/js_sdk_test/node_modules/jwt-decode/testem_dev.yml +0 -1
  459. data/lib/authing_ruby/test/js_sdk_test/node_modules/ms/index.js +0 -152
  460. data/lib/authing_ruby/test/js_sdk_test/node_modules/ms/license.md +0 -21
  461. data/lib/authing_ruby/test/js_sdk_test/node_modules/ms/package.json +0 -37
  462. data/lib/authing_ruby/test/js_sdk_test/node_modules/ms/readme.md +0 -51
@@ -1,2869 +0,0 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
- return new (P || (P = Promise))(function (resolve, reject) {
15
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
- step((generator = generator.apply(thisArg, _arguments || [])).next());
19
- });
20
- };
21
- var __generator = (this && this.__generator) || function (thisArg, body) {
22
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
- function verb(n) { return function (v) { return step([n, v]); }; }
25
- function step(op) {
26
- if (f) throw new TypeError("Generator is already executing.");
27
- while (_) try {
28
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
- if (y = 0, t) op = [op[0] & 2, t.value];
30
- switch (op[0]) {
31
- case 0: case 1: t = op; break;
32
- case 4: _.label++; return { value: op[1], done: false };
33
- case 5: _.label++; y = op[1]; op = [0]; continue;
34
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
- default:
36
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
- if (t[2]) _.ops.pop();
41
- _.trys.pop(); continue;
42
- }
43
- op = body.call(thisArg, _);
44
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
- }
47
- };
48
- var __importDefault = (this && this.__importDefault) || function (mod) {
49
- return (mod && mod.__esModule) ? mod : { "default": mod };
50
- };
51
- (function (factory) {
52
- if (typeof module === "object" && typeof module.exports === "object") {
53
- var v = factory(require, exports);
54
- if (v !== undefined) module.exports = v;
55
- }
56
- else if (typeof define === "function" && define.amd) {
57
- define(["require", "exports", "./AuthenticationTokenProvider", "crypto-js/sha256", "crypto-js", "../graphqlapi", "../common/GraphqlClient", "./types", "../../types/graphql.v2", "./QrCodeAuthenticationClient", "./MfaAuthenticationClient", "../common/HttpClient", "../utils", "jwt-decode", "./SocialAuthenticationClient", "../common/PublicKeyManager", "./EnterpriseAuthenticationClient", "./BaseAuthenticationClient"], factory);
58
- }
59
- })(function (require, exports) {
60
- "use strict";
61
- Object.defineProperty(exports, "__esModule", { value: true });
62
- exports.AuthenticationClient = void 0;
63
- var AuthenticationTokenProvider_1 = require("./AuthenticationTokenProvider");
64
- var sha256_1 = __importDefault(require("crypto-js/sha256"));
65
- var crypto_js_1 = __importDefault(require("crypto-js"));
66
- var graphqlapi_1 = require("../graphqlapi");
67
- var GraphqlClient_1 = require("../common/GraphqlClient");
68
- var types_1 = require("./types");
69
- var graphql_v2_1 = require("../../types/graphql.v2");
70
- var QrCodeAuthenticationClient_1 = require("./QrCodeAuthenticationClient");
71
- var MfaAuthenticationClient_1 = require("./MfaAuthenticationClient");
72
- var HttpClient_1 = require("../common/HttpClient");
73
- var utils_1 = require("../utils");
74
- var jwt_decode_1 = __importDefault(require("jwt-decode"));
75
- var SocialAuthenticationClient_1 = require("./SocialAuthenticationClient");
76
- var PublicKeyManager_1 = require("../common/PublicKeyManager");
77
- var EnterpriseAuthenticationClient_1 = require("./EnterpriseAuthenticationClient");
78
- var BaseAuthenticationClient_1 = require("./BaseAuthenticationClient");
79
- var DEFAULT_OPTIONS = {
80
- appId: undefined,
81
- appHost: undefined,
82
- protocol: 'oidc',
83
- tokenEndPointAuthMethod: 'client_secret_post',
84
- introspectionEndPointAuthMethod: 'client_secret_post',
85
- revocationEndPointAuthMethod: 'client_secret_post',
86
- timeout: 10000,
87
- onError: function (code, message, data) {
88
- throw { code: code, message: message, data: data };
89
- },
90
- requestFrom: 'sdk',
91
- encryptFunction: utils_1.encrypt,
92
- host: 'https://core.authing.cn',
93
- headers: {
94
- 'userpool-id': 'x-authing-userpool-id',
95
- 'app-id': 'x-authing-app-id',
96
- 'request-from': 'x-authing-request-from',
97
- 'sdk-version': 'x-authing-sdk-version',
98
- lang: 'x-authing-lang'
99
- }
100
- };
101
- /**
102
- * @class AuthenticationClient 认证核心模块
103
- * @description 此模块包含注册登录、重置手机号邮箱、修改账号信息等方法,是以你的终端用户(End User)的身份进行请求,适合在需要验证用户身份的情况下使用。
104
- *
105
- * @example
106
- *
107
- * 使用方法:
108
- *
109
- * \`\`\`javascript
110
- * import { AuthenticationClient } from "authing-js-sdk"
111
- * const authenticationClient = new AuthenticationClient({
112
- * appId: "YOUR_APP_ID",
113
- * })
114
- * authenticationClient.registerByEmail // 使用邮箱注册
115
- * authenticationClient.loginByEmail // 使用邮箱登录
116
- * \`\`\`
117
- *
118
- *
119
- * @name AuthenticationClient
120
- */
121
- var AuthenticationClient = /** @class */ (function () {
122
- function AuthenticationClient(options) {
123
- this.options = Object.assign({}, DEFAULT_OPTIONS, options);
124
- this.baseClient = new BaseAuthenticationClient_1.BaseAuthenticationClient(this.options);
125
- var graphqlEndpoint = this.baseClient.appHost + "/graphql/v2";
126
- // 子模块初始化顺序: GraphqlClient -> ManagementTokenProvider -> Others
127
- this.graphqlClient = new (this.options.graphqlClient || GraphqlClient_1.GraphqlClient)(graphqlEndpoint, this.options);
128
- this.tokenProvider = new (this.options.tokenProvider ||
129
- AuthenticationTokenProvider_1.AuthenticationTokenProvider)(this.options);
130
- this.httpClient = new (this.options.httpClient || HttpClient_1.HttpClient)(this.options, this.tokenProvider);
131
- this.naiveHttpClient = new HttpClient_1.NaiveHttpClient(this.options, this.tokenProvider);
132
- this.publicKeyManager = new PublicKeyManager_1.PublicKeyManager(this.options, this.httpClient);
133
- this.wxqrcode = new QrCodeAuthenticationClient_1.QrCodeAuthenticationClient(this.options, this.tokenProvider, this.httpClient, 'WXAPP_AUTH');
134
- this.qrcode = new QrCodeAuthenticationClient_1.QrCodeAuthenticationClient(this.options, this.tokenProvider, this.httpClient, 'APP_AUTH');
135
- this.mfa = new MfaAuthenticationClient_1.MfaAuthenticationClient(this.options, this.tokenProvider, this.httpClient);
136
- this.social = new SocialAuthenticationClient_1.SocialAuthenticationClient(this.options, this.tokenProvider, this.httpClient);
137
- this.enterprise = new EnterpriseAuthenticationClient_1.EnterpriseAuthenticationClient(this.options, this.tokenProvider, this.httpClient);
138
- if (this.options.token) {
139
- this.setToken(this.options.token);
140
- }
141
- }
142
- AuthenticationClient.prototype.checkLoggedIn = function () {
143
- var _a;
144
- var user = this.tokenProvider.getUser();
145
- if (user) {
146
- return user.id;
147
- }
148
- var token = this.tokenProvider.getToken();
149
- if (!token) {
150
- throw new Error('请先登录!');
151
- }
152
- var decoded = jwt_decode_1.default(token);
153
- var userId = decoded.sub || ((_a = decoded.data) === null || _a === void 0 ? void 0 : _a.id);
154
- if (!userId) {
155
- throw new Error('不合法的 accessToken');
156
- }
157
- return userId;
158
- };
159
- AuthenticationClient.prototype.setCurrentUser = function (user) {
160
- this.tokenProvider.setUser(user);
161
- };
162
- AuthenticationClient.prototype.setToken = function (token) {
163
- this.tokenProvider.setToken(token);
164
- };
165
- /**
166
- * @name registerByEmail
167
- * @name_zh 使用邮箱注册
168
- * @description 使用邮箱注册,此接口不要求用户对邮箱进行验证,用户注册之后 emailVerified 字段会为 false 。如果你希望邮箱未验证的用户不能进行登录,可以使用 pipeline 对此类请求进行拦截。
169
- *
170
- * @param {string} email 邮箱
171
- * @param {string} password 密码
172
- * @param {RegisterProfile} [profile] 用户资料
173
- * @param {Object} [options]
174
- * @param {boolean} [options.forceLogin] 是否走一遍完整的登录的,会触发登录前后的 pipeline 函数以及登录事件 webhook ,同时该用户的累计登录次数会加 1 。默认为 false 。
175
- * @param {boolean} [options.generateToken] 是否为该用户生成 token,不会触发登录后的完整流程,用户的累计登录次数不会加 1。默认为 false 。
176
- * @param {string} [options.clientIp] 客户端真实 IP,如果你在服务器端调用此接口,请务必将此参数设置为终端用户的真实 IP。
177
- *
178
- * @example
179
- *
180
- * authenticationClient.registerByEmail(
181
- * 'test@example.com',
182
- * 'passw0rd',
183
- * {
184
- * nickname: 'Nick'
185
- * },
186
- * {
187
- * generateToken: true
188
- * }
189
- * )
190
- *
191
- * @example
192
- * authenticationClient.registerByEmail('test@example.com', 'passw0rd')
193
- *
194
- *
195
- * @returns {Promise<User>}
196
- * @memberof AuthenticationClient
197
- */
198
- AuthenticationClient.prototype.registerByEmail = function (email, password, profile, options) {
199
- return __awaiter(this, void 0, void 0, function () {
200
- var _a, forceLogin, _b, generateToken, clientIp, params, context, customData, _c, _d, _e, extraParams, extraContext, user;
201
- return __generator(this, function (_f) {
202
- switch (_f.label) {
203
- case 0:
204
- options = options || {};
205
- profile = profile || {};
206
- _a = options.forceLogin, forceLogin = _a === void 0 ? false : _a, _b = options.generateToken, generateToken = _b === void 0 ? false : _b, clientIp = options.clientIp, params = options.params, context = options.context, customData = options.customData;
207
- _d = (_c = this.options).encryptFunction;
208
- _e = [password];
209
- return [4 /*yield*/, this.publicKeyManager.getPublicKey()];
210
- case 1: return [4 /*yield*/, _d.apply(_c, _e.concat([_f.sent()]))];
211
- case 2:
212
- password = _f.sent();
213
- extraParams = null;
214
- if (customData) {
215
- extraParams = JSON.stringify(utils_1.convertObjectToKeyValueList(customData));
216
- }
217
- else if (params) {
218
- extraParams = JSON.stringify(params);
219
- }
220
- extraContext = null;
221
- if (context) {
222
- extraContext = JSON.stringify(context);
223
- }
224
- return [4 /*yield*/, graphqlapi_1.registerByEmail(this.graphqlClient, this.tokenProvider, {
225
- input: {
226
- email: email,
227
- password: password,
228
- profile: profile,
229
- forceLogin: forceLogin,
230
- generateToken: generateToken,
231
- clientIp: clientIp,
232
- params: extraParams,
233
- context: extraContext
234
- }
235
- })];
236
- case 3:
237
- user = (_f.sent()).registerByEmail;
238
- this.setCurrentUser(user);
239
- return [2 /*return*/, user];
240
- }
241
- });
242
- });
243
- };
244
- /**
245
- * @name registerByUsername
246
- * @name_zh 使用用户名注册
247
- * @description 使用用户名注册
248
- *
249
- * @param {string} username 用户名
250
- * @param {string} password 密码
251
- * @param {RegisterProfile} [profile] 用户资料
252
- * @param {Object} [options]
253
- * @param {boolean} [options.forceLogin] 是否走一遍完整的登录的,会触发登录前后的 pipeline 函数以及登录事件 webhook ,同时该用户的累计登录次数会加 1 。默认为 false 。
254
- * @param {boolean} [options.generateToken] 是否为该用户生成 token,不会触发登录后的完整流程,用户的累计登录次数不会加 1。默认为 false 。
255
- * @param {string} [options.clientIp] 客户端真实 IP,如果你在服务器端调用此接口,请务必将此参数设置为终端用户的真实 IP。
256
- *
257
- *
258
- * @example
259
- *
260
- * authenticationClient.registerByUsername(
261
- * 'bob',
262
- * 'passw0rd',
263
- * {
264
- * nickname: 'Nick'
265
- * },
266
- * {
267
- * generateToken: true
268
- * }
269
- * )
270
- *
271
- * @example
272
- * authenticationClient.registerByUsername('bob', 'passw0rd')
273
- *
274
- *
275
- * @returns {Promise<User>}
276
- * @memberof AuthenticationClient
277
- */
278
- AuthenticationClient.prototype.registerByUsername = function (username, password, profile, options) {
279
- return __awaiter(this, void 0, void 0, function () {
280
- var _a, forceLogin, _b, generateToken, clientIp, params, context, customData, _c, _d, _e, extraParams, extraContext, user;
281
- return __generator(this, function (_f) {
282
- switch (_f.label) {
283
- case 0:
284
- options = options || {};
285
- profile = profile || {};
286
- _a = options.forceLogin, forceLogin = _a === void 0 ? false : _a, _b = options.generateToken, generateToken = _b === void 0 ? false : _b, clientIp = options.clientIp, params = options.params, context = options.context, customData = options.customData;
287
- _d = (_c = this.options).encryptFunction;
288
- _e = [password];
289
- return [4 /*yield*/, this.publicKeyManager.getPublicKey()];
290
- case 1: return [4 /*yield*/, _d.apply(_c, _e.concat([_f.sent()]))];
291
- case 2:
292
- password = _f.sent();
293
- extraParams = null;
294
- if (customData) {
295
- extraParams = JSON.stringify(utils_1.convertObjectToKeyValueList(customData));
296
- }
297
- else if (params) {
298
- extraParams = JSON.stringify(params);
299
- }
300
- extraContext = null;
301
- if (context) {
302
- extraContext = JSON.stringify(context);
303
- }
304
- return [4 /*yield*/, graphqlapi_1.registerByUsername(this.graphqlClient, this.tokenProvider, {
305
- input: {
306
- username: username,
307
- password: password,
308
- profile: profile,
309
- forceLogin: forceLogin,
310
- generateToken: generateToken,
311
- clientIp: clientIp,
312
- params: extraParams,
313
- context: extraContext
314
- }
315
- })];
316
- case 3:
317
- user = (_f.sent()).registerByUsername;
318
- this.setCurrentUser(user);
319
- return [2 /*return*/, user];
320
- }
321
- });
322
- });
323
- };
324
- /**
325
- * @name registerByPhoneCode
326
- * @name_zh 使用手机号注册
327
- * @description 使用手机号注册,你可以同时设置该账号的初始密码。发送短信的接口请见 sendSmsCode
328
- *
329
- * @param {string} phone 手机号
330
- * @param {string} code 短信验证码
331
- * @param {string} password 初始密码
332
- * @param {RegisterProfile} [profile] 用户资料
333
- * @param {Object} [options]
334
- * @param {boolean} [options.forceLogin] 是否走一遍完整的登录的,会触发登录前后的 pipeline 函数以及登录事件 webhook ,同时该用户的累计登录次数会加 1 。默认为 false 。
335
- * @param {boolean} [options.generateToken] 是否为该用户生成 token,不会触发登录后的完整流程,用户的累计登录次数不会加 1。默认为 false 。
336
- * @param {string} [options.clientIp] 客户端真实 IP,如果你在服务器端调用此接口,请务必将此参数设置为终端用户的真实 IP。
337
- *
338
- * @example
339
- *
340
- * authenticationClient.registerByPhoneCode(
341
- * '176xxxx7041',
342
- * '1234',
343
- * 'passw0rd',
344
- * {
345
- * nickname: 'Nick'
346
- * },
347
- * {
348
- * generateToken: true
349
- * }
350
- * )
351
- *
352
- * @example
353
- * authenticationClient.registerByPhoneCode('176xxxx7041', '1234')
354
- *
355
- *
356
- * @returns {Promise<User>}
357
- * @memberof AuthenticationClient
358
- */
359
- AuthenticationClient.prototype.registerByPhoneCode = function (phone, code, password, profile, options) {
360
- return __awaiter(this, void 0, void 0, function () {
361
- var _a, forceLogin, _b, generateToken, clientIp, params, context, customData, _c, _d, _e, extraParams, extraContext, user;
362
- return __generator(this, function (_f) {
363
- switch (_f.label) {
364
- case 0:
365
- options = options || {};
366
- profile = profile || {};
367
- _a = options.forceLogin, forceLogin = _a === void 0 ? false : _a, _b = options.generateToken, generateToken = _b === void 0 ? false : _b, clientIp = options.clientIp, params = options.params, context = options.context, customData = options.customData;
368
- if (!password) return [3 /*break*/, 3];
369
- _d = (_c = this.options).encryptFunction;
370
- _e = [password];
371
- return [4 /*yield*/, this.publicKeyManager.getPublicKey()];
372
- case 1: return [4 /*yield*/, _d.apply(_c, _e.concat([_f.sent()]))];
373
- case 2:
374
- password = _f.sent();
375
- _f.label = 3;
376
- case 3:
377
- extraParams = null;
378
- if (customData) {
379
- extraParams = JSON.stringify(utils_1.convertObjectToKeyValueList(customData));
380
- }
381
- else if (params) {
382
- extraParams = JSON.stringify(params);
383
- }
384
- extraContext = null;
385
- if (context) {
386
- extraContext = JSON.stringify(context);
387
- }
388
- return [4 /*yield*/, graphqlapi_1.registerByPhoneCode(this.graphqlClient, this.tokenProvider, {
389
- input: {
390
- phone: phone,
391
- code: code,
392
- password: password,
393
- profile: profile,
394
- forceLogin: forceLogin,
395
- generateToken: generateToken,
396
- clientIp: clientIp,
397
- params: extraParams,
398
- context: extraContext
399
- }
400
- })];
401
- case 4:
402
- user = (_f.sent()).registerByPhoneCode;
403
- this.setCurrentUser(user);
404
- return [2 /*return*/, user];
405
- }
406
- });
407
- });
408
- };
409
- /**
410
- * @name checkPasswordStrength
411
- * @name_zh 检查密码强度
412
- * @description 检查密码强度,详情请见: https://docs.authing.co/v2/guides/security/config-password.html
413
- *
414
- * @param {string} password
415
- * @example
416
- * authenticationClient.checkPasswordStrength('weak')
417
- *
418
- * @example
419
- * authenticationClient.checkPasswordStrength('strongPassw0rd!')
420
- *
421
- * @returns {Promise<CheckPasswordStrengthResult>}
422
- * @memberof AuthenticationClient
423
- */
424
- AuthenticationClient.prototype.checkPasswordStrength = function (password) {
425
- return __awaiter(this, void 0, void 0, function () {
426
- var result;
427
- return __generator(this, function (_a) {
428
- switch (_a.label) {
429
- case 0: return [4 /*yield*/, graphqlapi_1.checkPasswordStrength(this.graphqlClient, this.tokenProvider, { password: password })];
430
- case 1:
431
- result = (_a.sent()).checkPasswordStrength;
432
- return [2 /*return*/, result];
433
- }
434
- });
435
- });
436
- };
437
- /**
438
- * @name sendSmsCode
439
- * @name_zh 发送短信验证码
440
- * @description 发送短信验证码, 短信验证码的有效时间为 60 s。
441
- *
442
- * @param {string} phone
443
- * @example
444
- * authenticationClient.sendSmsCode('176xxxx6754')
445
- *
446
- * @returns {Promise<CommonMessage>}
447
- * @memberof AuthenticationClient
448
- */
449
- AuthenticationClient.prototype.sendSmsCode = function (phone) {
450
- return __awaiter(this, void 0, void 0, function () {
451
- var api, data;
452
- return __generator(this, function (_a) {
453
- switch (_a.label) {
454
- case 0:
455
- api = this.baseClient.appHost + "/api/v2/sms/send";
456
- return [4 /*yield*/, this.httpClient.request({
457
- method: 'POST',
458
- url: api,
459
- data: { phone: phone }
460
- })];
461
- case 1:
462
- data = _a.sent();
463
- return [2 /*return*/, data];
464
- }
465
- });
466
- });
467
- };
468
- /**
469
- * @name loginByEmail
470
- * @name_zh 使用邮箱登录
471
- * @description 使用邮箱登录,该接口默认不会限制未验证的邮箱进行登录,如果你希望邮箱未验证的用户不能进行登录,可以使用 pipeline 对此类请求进行拦截。
472
- *
473
- * 如果你的用户池配置了登录失败检测,当同一 IP 下登录多次失败的时候会要求用户输入图形验证码(code 为 2000)。
474
- *
475
- * @param {string} email 邮箱
476
- * @param {string} password 密码
477
- * @param {Object} [options]
478
- * @param {boolean} [options.autoRegister] 是否自动注册。如果检测到用户不存在,会根据登录账密自动创建一个账号。
479
- * @param {string} [options.captchaCode] 图形验证码
480
- * @param {string} [options.clientIp] 客户端真实 IP,如果你在服务器端调用此接口,请务必将此参数设置为终端用户的真实 IP。
481
- *
482
- * @example
483
- *
484
- * authenticationClient.loginByEmail(
485
- * 'test@example.com',
486
- * 'passw0rd',
487
- * {
488
- * autoRegister: true,
489
- * captchaCode: 'xj72'
490
- * }
491
- * )
492
- *
493
- * @example
494
- * authenticationClient.loginByEmail('test@example.com', 'passw0rd')
495
- *
496
- *
497
- * @returns {Promise<User>}
498
- * @memberof AuthenticationClient
499
- */
500
- AuthenticationClient.prototype.loginByEmail = function (email, password, options) {
501
- return __awaiter(this, void 0, void 0, function () {
502
- var _a, autoRegister, captchaCode, clientIp, params, context, customData, _b, _c, _d, extraParams, extraContext, user;
503
- return __generator(this, function (_e) {
504
- switch (_e.label) {
505
- case 0:
506
- options = options || {};
507
- _a = options.autoRegister, autoRegister = _a === void 0 ? false : _a, captchaCode = options.captchaCode, clientIp = options.clientIp, params = options.params, context = options.context, customData = options.customData;
508
- _c = (_b = this.options).encryptFunction;
509
- _d = [password];
510
- return [4 /*yield*/, this.publicKeyManager.getPublicKey()];
511
- case 1: return [4 /*yield*/, _c.apply(_b, _d.concat([_e.sent()]))];
512
- case 2:
513
- password = _e.sent();
514
- extraParams = null;
515
- if (customData) {
516
- extraParams = JSON.stringify(utils_1.convertObjectToKeyValueList(customData));
517
- }
518
- else if (params) {
519
- extraParams = JSON.stringify(params);
520
- }
521
- extraContext = null;
522
- if (context) {
523
- extraContext = JSON.stringify(context);
524
- }
525
- return [4 /*yield*/, graphqlapi_1.loginByEmail(this.graphqlClient, this.tokenProvider, {
526
- input: {
527
- email: email,
528
- password: password,
529
- autoRegister: autoRegister,
530
- captchaCode: captchaCode,
531
- clientIp: clientIp,
532
- params: extraParams,
533
- context: extraContext
534
- }
535
- })];
536
- case 3:
537
- user = (_e.sent()).loginByEmail;
538
- this.setCurrentUser(user);
539
- return [2 /*return*/, user];
540
- }
541
- });
542
- });
543
- };
544
- /**
545
- * @name loginByUsername
546
- * @name_zh 使用用户名登录
547
- * @description 使用用户名登录。
548
- *
549
- * 如果你的用户池配置了登录失败检测,当同一 IP 下登录多次失败的时候会要求用户输入图形验证码(code 为 2000)。
550
- *
551
- * @param {string} username 用户名
552
- * @param {string} password 密码
553
- * @param {Object} [options]
554
- * @param {boolean} [options.autoRegister] 是否自动注册。如果检测到用户不存在,会根据登录账密自动创建一个账号。
555
- * @param {string} [options.captchaCode] 图形验证码
556
- * @param {string} [options.clientIp] 客户端真实 IP,如果你在服务器端调用此接口,请务必将此参数设置为终端用户的真实 IP。
557
- *
558
- *
559
- * @example
560
- *
561
- * authenticationClient.loginByEmail(
562
- * 'test@example.com',
563
- * 'passw0rd',
564
- * {
565
- * autoRegister: true,
566
- * captchaCode: 'xj72'
567
- * }
568
- * )
569
- *
570
- * @example
571
- * authenticationClient.loginByEmail('test@example.com', 'passw0rd')
572
- *
573
- *
574
- * @returns {Promise<User>}
575
- * @memberof AuthenticationClient
576
- */
577
- AuthenticationClient.prototype.loginByUsername = function (username, password, options) {
578
- return __awaiter(this, void 0, void 0, function () {
579
- var _a, autoRegister, captchaCode, clientIp, params, context, customData, _b, _c, _d, extraParams, extraContext, user;
580
- return __generator(this, function (_e) {
581
- switch (_e.label) {
582
- case 0:
583
- options = options || {};
584
- _a = options.autoRegister, autoRegister = _a === void 0 ? false : _a, captchaCode = options.captchaCode, clientIp = options.clientIp, params = options.params, context = options.context, customData = options.customData;
585
- _c = (_b = this.options).encryptFunction;
586
- _d = [password];
587
- return [4 /*yield*/, this.publicKeyManager.getPublicKey()];
588
- case 1: return [4 /*yield*/, _c.apply(_b, _d.concat([_e.sent()]))];
589
- case 2:
590
- password = _e.sent();
591
- extraParams = null;
592
- if (customData) {
593
- extraParams = JSON.stringify(utils_1.convertObjectToKeyValueList(customData));
594
- }
595
- else if (params) {
596
- extraParams = JSON.stringify(params);
597
- }
598
- extraContext = null;
599
- if (context) {
600
- extraContext = JSON.stringify(context);
601
- }
602
- return [4 /*yield*/, graphqlapi_1.loginByUsername(this.graphqlClient, this.tokenProvider, {
603
- input: {
604
- username: username,
605
- password: password,
606
- autoRegister: autoRegister,
607
- captchaCode: captchaCode,
608
- clientIp: clientIp,
609
- params: extraParams,
610
- context: extraContext
611
- }
612
- })];
613
- case 3:
614
- user = (_e.sent()).loginByUsername;
615
- this.setCurrentUser(user);
616
- return [2 /*return*/, user];
617
- }
618
- });
619
- });
620
- };
621
- /**
622
- * @name loginByPhoneCode
623
- * @name_zh 使用手机号验证码登录
624
- * @description 使用手机号验证码登录。
625
- *
626
- *
627
- * @param {string} phone 手机号
628
- * @param {string} code 短信验证码
629
- * @param {string} [options.clientIp] 客户端真实 IP,如果你在服务器端调用此接口,请务必将此参数设置为终端用户的真实 IP。
630
- *
631
- * @example
632
- *
633
- * authenticationClient.loginByPhoneCode(
634
- * '176xxxx7041',
635
- * '1234',
636
- * )
637
- *
638
- *
639
- * @returns {Promise<User>}
640
- * @memberof AuthenticationClient
641
- */
642
- AuthenticationClient.prototype.loginByPhoneCode = function (phone, code, options) {
643
- return __awaiter(this, void 0, void 0, function () {
644
- var clientIp, params, context, customData, extraParams, extraContext, user;
645
- return __generator(this, function (_a) {
646
- switch (_a.label) {
647
- case 0:
648
- options = options || {};
649
- clientIp = options.clientIp, params = options.params, context = options.context, customData = options.customData;
650
- extraParams = null;
651
- if (customData) {
652
- extraParams = JSON.stringify(utils_1.convertObjectToKeyValueList(customData));
653
- }
654
- else if (params) {
655
- extraParams = JSON.stringify(params);
656
- }
657
- extraContext = null;
658
- if (context) {
659
- extraContext = JSON.stringify(context);
660
- }
661
- return [4 /*yield*/, graphqlapi_1.loginByPhoneCode(this.graphqlClient, this.tokenProvider, {
662
- input: {
663
- phone: phone,
664
- code: code,
665
- clientIp: clientIp,
666
- params: extraParams,
667
- context: extraContext
668
- }
669
- })];
670
- case 1:
671
- user = (_a.sent()).loginByPhoneCode;
672
- this.setCurrentUser(user);
673
- return [2 /*return*/, user];
674
- }
675
- });
676
- });
677
- };
678
- /**
679
- * @name loginByPhonePassword
680
- * @name_zh 使用手机号密码登录
681
- * @description 使用手机号密码登录。
682
- *
683
- *
684
- * @param {string} phone 手机号
685
- * @param {string} password 密码
686
- * @param {Object} [options]
687
- * @param {string} [options.captchaCode] 图形验证码
688
- * @param {string} [options.clientIp] 客户端真实 IP,如果你在服务器端调用此接口,请务必将此参数设置为终端用户的真实 IP。
689
- *
690
- * @example
691
- *
692
- * authenticationClient.loginByPhonePassword(
693
- * '176xxxx7041',
694
- * 'passw0rd',
695
- * {
696
- * captchaCode: 'xj72'
697
- * }
698
- * )
699
- *
700
- * @example
701
- * authenticationClient.loginByPhonePassword('176xxxx7041', 'passw0rd')
702
- *
703
- *
704
- * @returns {Promise<User>}
705
- * @memberof AuthenticationClient
706
- */
707
- AuthenticationClient.prototype.loginByPhonePassword = function (phone, password, options) {
708
- return __awaiter(this, void 0, void 0, function () {
709
- var captchaCode, _a, autoRegister, clientIp, params, context, customData, _b, _c, _d, extraParams, extraContext, user;
710
- return __generator(this, function (_e) {
711
- switch (_e.label) {
712
- case 0:
713
- options = options || {};
714
- captchaCode = options.captchaCode, _a = options.autoRegister, autoRegister = _a === void 0 ? false : _a, clientIp = options.clientIp, params = options.params, context = options.context, customData = options.customData;
715
- _c = (_b = this.options).encryptFunction;
716
- _d = [password];
717
- return [4 /*yield*/, this.publicKeyManager.getPublicKey()];
718
- case 1: return [4 /*yield*/, _c.apply(_b, _d.concat([_e.sent()]))];
719
- case 2:
720
- password = _e.sent();
721
- extraParams = null;
722
- if (customData) {
723
- extraParams = JSON.stringify(utils_1.convertObjectToKeyValueList(customData));
724
- }
725
- else if (params) {
726
- extraParams = JSON.stringify(params);
727
- }
728
- extraContext = null;
729
- if (context) {
730
- extraContext = JSON.stringify(context);
731
- }
732
- return [4 /*yield*/, graphqlapi_1.loginByPhonePassword(this.graphqlClient, this.tokenProvider, {
733
- input: {
734
- phone: phone,
735
- password: password,
736
- captchaCode: captchaCode,
737
- autoRegister: autoRegister,
738
- clientIp: clientIp,
739
- params: extraParams,
740
- context: extraContext
741
- }
742
- })];
743
- case 3:
744
- user = (_e.sent()).loginByPhonePassword;
745
- this.setCurrentUser(user);
746
- return [2 /*return*/, user];
747
- }
748
- });
749
- });
750
- };
751
- AuthenticationClient.prototype.loginBySubAccount = function (account, password, options) {
752
- return __awaiter(this, void 0, void 0, function () {
753
- var captchaCode, clientIp, _a, _b, _c, user;
754
- return __generator(this, function (_d) {
755
- switch (_d.label) {
756
- case 0:
757
- options = options || {};
758
- captchaCode = options.captchaCode, clientIp = options.clientIp;
759
- _b = (_a = this.options).encryptFunction;
760
- _c = [password];
761
- return [4 /*yield*/, this.publicKeyManager.getPublicKey()];
762
- case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([_d.sent()]))];
763
- case 2:
764
- password = _d.sent();
765
- return [4 /*yield*/, graphqlapi_1.loginBySubAccount(this.graphqlClient, this.tokenProvider, {
766
- account: account,
767
- password: password,
768
- captchaCode: captchaCode,
769
- clientIp: clientIp
770
- })];
771
- case 3:
772
- user = (_d.sent()).loginBySubAccount;
773
- this.setCurrentUser(user);
774
- return [2 /*return*/, user];
775
- }
776
- });
777
- });
778
- };
779
- /**
780
- * @name checkLoginStatus
781
- * @name_zh 检测 Token 登录状态
782
- * @description 检测 Token 登录状态
783
- *
784
- * @param {string} token 用户的登录凭证 token
785
- *
786
- * @example
787
- *
788
- * authenticationClient.checkLoginStatus('TOKEN')
789
- *
790
- * @returns {Promise<JwtTokenStatus>}
791
- * @memberof AuthenticationClient
792
- */
793
- AuthenticationClient.prototype.checkLoginStatus = function (token) {
794
- return __awaiter(this, void 0, void 0, function () {
795
- var res;
796
- return __generator(this, function (_a) {
797
- switch (_a.label) {
798
- case 0: return [4 /*yield*/, graphqlapi_1.checkLoginStatus(this.graphqlClient, this.tokenProvider, {
799
- token: token
800
- })];
801
- case 1:
802
- res = _a.sent();
803
- return [2 /*return*/, res.checkLoginStatus];
804
- }
805
- });
806
- });
807
- };
808
- /**
809
- * @name sendEmail
810
- * @name_zh 发送邮件
811
- * @description 发送邮件
812
- *
813
- * @param {string} email 邮箱
814
- * @param {EmailScene} scene 发送场景,可选值为 RESET_PASSWORD(发送重置密码邮件,邮件中包含验证码)、VerifyEmail(发送验证邮箱的邮件)、ChangeEmail(发送修改邮箱邮件,邮件中包含验证码)
815
- *
816
- * @example
817
- *
818
- * import { EmailScene } from "authing-js-sdk"
819
- * authenticationClient.sendEmail('test@example.com', EmailScene.RESET_PASSWORD)
820
- *
821
- * @returns {Promise<CommonMessage>}
822
- * @memberof AuthenticationClient
823
- */
824
- AuthenticationClient.prototype.sendEmail = function (email, scene) {
825
- return __awaiter(this, void 0, void 0, function () {
826
- var data;
827
- return __generator(this, function (_a) {
828
- switch (_a.label) {
829
- case 0: return [4 /*yield*/, graphqlapi_1.sendEmail(this.graphqlClient, this.tokenProvider, { email: email, scene: scene })];
830
- case 1:
831
- data = (_a.sent()).sendEmail;
832
- return [2 /*return*/, data];
833
- }
834
- });
835
- });
836
- };
837
- /**
838
- * @name resetPasswordByPhoneCode
839
- * @name_zh 通过短信验证码重置密码
840
- * @description 通过短信验证码重置密码,你需要先调用 sendSmsCode 接口发送重置密码邮件。
841
- *
842
- * @param {string} phone 手机号
843
- * @param {string} code 验证码
844
- * @param {string} newPassword 新的密码
845
- *
846
- * @example
847
- *
848
- * authenticationClient.resetPasswordByPhoneCode('176xxxx7041', '1234', 'passw0rd')
849
- *
850
- * @returns {Promise<CommonMessage>}
851
- * @memberof AuthenticationClient
852
- */
853
- AuthenticationClient.prototype.resetPasswordByPhoneCode = function (phone, code, newPassword) {
854
- return __awaiter(this, void 0, void 0, function () {
855
- var _a, _b, _c, data;
856
- return __generator(this, function (_d) {
857
- switch (_d.label) {
858
- case 0:
859
- _b = (_a = this.options).encryptFunction;
860
- _c = [newPassword];
861
- return [4 /*yield*/, this.publicKeyManager.getPublicKey()];
862
- case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([_d.sent()]))];
863
- case 2:
864
- newPassword = _d.sent();
865
- return [4 /*yield*/, graphqlapi_1.resetPassword(this.graphqlClient, this.tokenProvider, {
866
- phone: phone,
867
- code: code,
868
- newPassword: newPassword
869
- })];
870
- case 3:
871
- data = (_d.sent()).resetPassword;
872
- return [2 /*return*/, data];
873
- }
874
- });
875
- });
876
- };
877
- /**
878
- * @name resetPasswordByEmailCode
879
- * @name_zh 通过邮件验证码重置密码
880
- * @description 通过邮件验证码重置密码,你需要先调用 sendEmail 接口发送重置密码邮件。
881
- *
882
- * @param {string} phone 手机号
883
- * @param {string} code 验证码
884
- * @param {string} newPassword 新的密码
885
- *
886
- * @example
887
- *
888
- * authenticationClient.resetPasswordByEmailCode('test@example.com', '1234', 'passw0rd')
889
- *
890
- * @returns {Promise<CommonMessage>}
891
- * @memberof AuthenticationClient
892
- */
893
- AuthenticationClient.prototype.resetPasswordByEmailCode = function (email, code, newPassword) {
894
- return __awaiter(this, void 0, void 0, function () {
895
- var _a, _b, _c, data;
896
- return __generator(this, function (_d) {
897
- switch (_d.label) {
898
- case 0:
899
- _b = (_a = this.options).encryptFunction;
900
- _c = [newPassword];
901
- return [4 /*yield*/, this.publicKeyManager.getPublicKey()];
902
- case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([_d.sent()]))];
903
- case 2:
904
- newPassword = _d.sent();
905
- return [4 /*yield*/, graphqlapi_1.resetPassword(this.graphqlClient, this.tokenProvider, {
906
- email: email,
907
- code: code,
908
- newPassword: newPassword
909
- })];
910
- case 3:
911
- data = (_d.sent()).resetPassword;
912
- return [2 /*return*/, data];
913
- }
914
- });
915
- });
916
- };
917
- AuthenticationClient.prototype.resetPasswordByFirstLoginToken = function (params) {
918
- return __awaiter(this, void 0, void 0, function () {
919
- var token, password, _a, _b, _c, data;
920
- return __generator(this, function (_d) {
921
- switch (_d.label) {
922
- case 0:
923
- token = params.token, password = params.password;
924
- _b = (_a = this.options).encryptFunction;
925
- _c = [password];
926
- return [4 /*yield*/, this.publicKeyManager.getPublicKey()];
927
- case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([_d.sent()]))];
928
- case 2:
929
- password = _d.sent();
930
- return [4 /*yield*/, graphqlapi_1.resetPasswordByFirstLoginToken(this.graphqlClient, this.tokenProvider, {
931
- token: token,
932
- password: password
933
- })];
934
- case 3:
935
- data = (_d.sent()).resetPasswordByFirstLoginToken;
936
- return [2 /*return*/, data];
937
- }
938
- });
939
- });
940
- };
941
- /**
942
- * @name updateProfile
943
- * @name_zh 修改用户资料
944
- * @description 修改用户资料,此接口不能用于修改手机号、邮箱、密码,如果需要请调用 updatePhone、updateEmail、updatePassword 接口。
945
- *
946
- * @param {UpdateUserInput} updates 修改的用户资料
947
- * @param {string} updates.username 用户名
948
- * @param {string} updates.nickname 昵称
949
- * @param {string} updates.photo 头像
950
- * @param {string} updates.company 公司
951
- * @param {string} updates.browser 浏览器
952
- * @param {string} updates.device 设备
953
- * @param {string} updates.lastIP 最近登录的 IP
954
- * @param {string} updates.name Name
955
- * @param {string} updates.givenName Given Name
956
- * @param {string} updates.familyName Family Name
957
- * @param {string} updates.middleName Middle Name
958
- * @param {string} updates.profile Profile Url
959
- * @param {string} updates.preferredUsername Preferred Name
960
- * @param {string} updates.website 个人网站
961
- * @param {string} updates.gender 性别, F 表示男性、W 表示女性、未知表示 U
962
- * @param {string} updates.birthdate 生日
963
- * @param {string} updates.zoneinfo 时区
964
- * @param {string} updates.locale 语言
965
- * @param {string} updates.address 地址
966
- * @param {string} updates.streetAddress 街道地址
967
- * @param {string} updates.locality
968
- * @param {string} updates.region 地域
969
- * @param {string} updates.postalCode 邮编
970
- * @param {string} updates.city 城市
971
- * @param {string} updates.province 省份
972
- * @param {string} updates.country 国家
973
- *
974
- * @example
975
- *
976
- * authenticationClient.updateProfile({
977
- * nickname: "Nick",
978
- * lastIp: "111.111.111.111"
979
- * })
980
- *
981
- * @returns {Promise<User>}
982
- * @memberof AuthenticationClient
983
- */
984
- AuthenticationClient.prototype.updateProfile = function (updates) {
985
- return __awaiter(this, void 0, void 0, function () {
986
- var userId, updated;
987
- return __generator(this, function (_a) {
988
- switch (_a.label) {
989
- case 0:
990
- userId = this.checkLoggedIn();
991
- if (updates && updates.password) {
992
- delete updates.password;
993
- }
994
- return [4 /*yield*/, graphqlapi_1.updateUser(this.graphqlClient, this.tokenProvider, {
995
- id: userId,
996
- input: updates
997
- })];
998
- case 1:
999
- updated = (_a.sent()).updateUser;
1000
- this.setCurrentUser(updated);
1001
- return [2 /*return*/, updated];
1002
- }
1003
- });
1004
- });
1005
- };
1006
- /**
1007
- * @name updatePassword
1008
- * @name_zh 更新用户密码
1009
- * @description 更新用户密码
1010
- *
1011
- * @param {string} newPassword 新密码
1012
- * @param {string} [oldPassword] 旧密码,如果用户没有设置密码,可以不填。
1013
- *
1014
- * @example
1015
- *
1016
- * authenticationClient.updatePassword('passw0rd') // 由手机号、社会化登录等其他方式注册的,首次没有设置密码,oldPassword 留空。
1017
- *
1018
- * @example
1019
- *
1020
- * authenticationClient.updatePassword('passw0rd', 'oldPassw0rd') // 用户之前设置了密码
1021
- *
1022
- * @returns {Promise<User>}
1023
- * @memberof AuthenticationClient
1024
- */
1025
- AuthenticationClient.prototype.updatePassword = function (newPassword, oldPassword) {
1026
- return __awaiter(this, void 0, void 0, function () {
1027
- var _a, _b, _c, _d, _e, _f, _g, _h, user;
1028
- return __generator(this, function (_j) {
1029
- switch (_j.label) {
1030
- case 0:
1031
- _a = newPassword;
1032
- if (!_a) return [3 /*break*/, 3];
1033
- _c = (_b = this.options).encryptFunction;
1034
- _d = [newPassword];
1035
- return [4 /*yield*/, this.publicKeyManager.getPublicKey()];
1036
- case 1: return [4 /*yield*/, _c.apply(_b, _d.concat([_j.sent()]))];
1037
- case 2:
1038
- _a = (_j.sent());
1039
- _j.label = 3;
1040
- case 3:
1041
- newPassword = _a;
1042
- _e = oldPassword;
1043
- if (!_e) return [3 /*break*/, 6];
1044
- _g = (_f = this.options).encryptFunction;
1045
- _h = [oldPassword];
1046
- return [4 /*yield*/, this.publicKeyManager.getPublicKey()];
1047
- case 4: return [4 /*yield*/, _g.apply(_f, _h.concat([_j.sent()]))];
1048
- case 5:
1049
- _e = (_j.sent());
1050
- _j.label = 6;
1051
- case 6:
1052
- oldPassword = _e;
1053
- return [4 /*yield*/, graphqlapi_1.updatePassword(this.graphqlClient, this.tokenProvider, {
1054
- newPassword: newPassword,
1055
- oldPassword: oldPassword
1056
- })];
1057
- case 7:
1058
- user = (_j.sent()).updatePassword;
1059
- return [2 /*return*/, user];
1060
- }
1061
- });
1062
- });
1063
- };
1064
- /**
1065
- * @name updatePhone
1066
- * @name_zh 更新用户手机号
1067
- * @description 更新用户手机号。和修改邮箱一样,默认情况下,如果用户当前已经绑定了手机号,需要同时验证原有手机号(目前账号绑定的手机号)和当前邮箱(将要绑定的手机号)。
1068
- * 也就是说,用户 A 当前绑定的手机号为 15888888888,想修改为 15899999999,那么就需要同时验证这两个手机号。
1069
- * 开发者也可以选择不开启 “验证原有手机号“ ,可以在 Authing 控制台 的 设置目录下的安全信息模块进行关闭。
1070
- * 用户首次绑定手机号请使用 bindPhone 接口。
1071
- *
1072
- * @param {string} phone 新手机号
1073
- * @param {string} phoneCode 新手机号的验证码
1074
- * @param {string} [oldPhone] 旧手机号
1075
- * @param {string} [oldPhoneCode] 旧手机号的验证码
1076
- *
1077
- * @example
1078
- *
1079
- * authenticationClient.updatePhone('176xxxx7041', '1234') // 关闭了“验证原有手机号“选项
1080
- *
1081
- * @example
1082
- *
1083
- * authenticationClient.updatePhone('176xxxx7041', '1234', '156xxxx9876', '1234') // 开启了“验证原有手机号“选项
1084
- *
1085
- *
1086
- * @returns {Promise<User>}
1087
- * @memberof AuthenticationClient
1088
- */
1089
- AuthenticationClient.prototype.updatePhone = function (phone, phoneCode, oldPhone, oldPhoneCode) {
1090
- return __awaiter(this, void 0, void 0, function () {
1091
- var user;
1092
- return __generator(this, function (_a) {
1093
- switch (_a.label) {
1094
- case 0: return [4 /*yield*/, graphqlapi_1.updatePhone(this.graphqlClient, this.tokenProvider, {
1095
- phone: phone,
1096
- phoneCode: phoneCode,
1097
- oldPhone: oldPhone,
1098
- oldPhoneCode: oldPhoneCode
1099
- })];
1100
- case 1:
1101
- user = (_a.sent()).updatePhone;
1102
- return [2 /*return*/, user];
1103
- }
1104
- });
1105
- });
1106
- };
1107
- /**
1108
- * @name updateEmail
1109
- * @name_zh 更新用户邮箱
1110
- * @description 如果用户已经绑定了邮箱,默认情况下,需要同时验证原有邮箱(目前账号绑定的邮箱)和当前邮箱(将要绑定的邮箱)。也就是说,用户 A 当前绑定的邮箱为 123456@qq.com,想修改为 1234567@qq.com,那么就需要同时验证这两个邮箱。
1111
- * 开发者也可以选择不开启 “验证原有邮箱“ ,可以在 Authing 控制台 的 设置目录下的安全信息模块进行关闭。
1112
- * 用户首次绑定手机号请使用 bindEmail 接口。
1113
- *
1114
- * @param {string} email 新邮箱
1115
- * @param {string} emailCode 新邮箱的验证码
1116
- * @param {string} [oldEmail] 旧邮箱
1117
- * @param {string} [oldEmailCode] 旧邮箱的验证码
1118
- *
1119
- * @example
1120
- *
1121
- * authenticationClient.updateEmail('test@example.com', '1234') // 关闭了“验证原有邮箱“选项
1122
- *
1123
- * @example
1124
- *
1125
- * authenticationClient.updateEmail('test@example.com', '1234', 'test2@example.com', '1234') // 开启了“验证原有邮箱“选项
1126
- *
1127
- *
1128
- * @returns {Promise<User>}
1129
- * @memberof AuthenticationClient
1130
- */
1131
- AuthenticationClient.prototype.updateEmail = function (email, emailCode, oldEmail, oldEmailCode) {
1132
- return __awaiter(this, void 0, void 0, function () {
1133
- var user;
1134
- return __generator(this, function (_a) {
1135
- switch (_a.label) {
1136
- case 0: return [4 /*yield*/, graphqlapi_1.updateEmail(this.graphqlClient, this.tokenProvider, {
1137
- email: email,
1138
- emailCode: emailCode,
1139
- oldEmail: oldEmail,
1140
- oldEmailCode: oldEmailCode
1141
- })];
1142
- case 1:
1143
- user = (_a.sent()).updateEmail;
1144
- return [2 /*return*/, user];
1145
- }
1146
- });
1147
- });
1148
- };
1149
- /**
1150
- * @name refreshToken
1151
- * @name_zh 刷新当前用户的 token
1152
- * @description 刷新当前用户的 token,调用此接口要求先登录。
1153
- *
1154
- * @example
1155
- *
1156
- * authenticationClient.updateEmail()
1157
- *
1158
- * @returns {Promise<RefreshToken>}
1159
- * @memberof AuthenticationClient
1160
- */
1161
- AuthenticationClient.prototype.refreshToken = function () {
1162
- return __awaiter(this, void 0, void 0, function () {
1163
- var data;
1164
- return __generator(this, function (_a) {
1165
- switch (_a.label) {
1166
- case 0: return [4 /*yield*/, graphqlapi_1.refreshToken(this.graphqlClient, this.tokenProvider, {})];
1167
- case 1:
1168
- data = (_a.sent()).refreshToken;
1169
- this.setToken(data.token);
1170
- return [2 /*return*/, data];
1171
- }
1172
- });
1173
- });
1174
- };
1175
- /**
1176
- * @name linkAccount
1177
- * @name_zh 关联账号
1178
- * @description 将社交账号绑定到主账号(手机号、邮箱账号)。
1179
- *
1180
- * @param {Object} options
1181
- * @param {string} options.primaryUserToken 主账号 Token
1182
- * @param {string} options.secondaryUserToken 社交账号 Token
1183
- *
1184
- * @example
1185
- *
1186
- * authenticationClient.linkAccount({ primaryUserToken: '', secondaryUserToken: '' })
1187
- *
1188
- * @returns {{code: 200, message: "绑定成功"}}
1189
- * @memberof AuthenticationClient
1190
- */
1191
- AuthenticationClient.prototype.linkAccount = function (options) {
1192
- return __awaiter(this, void 0, void 0, function () {
1193
- return __generator(this, function (_a) {
1194
- switch (_a.label) {
1195
- case 0: return [4 /*yield*/, this.httpClient.request({
1196
- method: 'POST',
1197
- url: this.baseClient.appHost + "/api/v2/users/link",
1198
- data: {
1199
- primaryUserToken: options.primaryUserToken,
1200
- secondaryUserToken: options.secondaryUserToken
1201
- }
1202
- })];
1203
- case 1:
1204
- _a.sent();
1205
- return [2 /*return*/, { code: 200, message: '绑定成功' }];
1206
- }
1207
- });
1208
- });
1209
- };
1210
- /**
1211
- * @name unLinkAccount
1212
- * @name_zh 解除账号绑定
1213
- * @description 将社交账号从主账号(手机号、邮箱账号)解绑。
1214
- *
1215
- * @param {Object} options
1216
- * @param {string} options.primaryUserToken 主账号 Token
1217
- * @param {string} options.provider 社交账号的提供商名称
1218
- *
1219
- * @example
1220
- *
1221
- * authenticationClient.unLinkAccount({ primaryUserToken: '', provider: 'wechat:pc' })
1222
- *
1223
- * @returns {{code: 200, message: "解绑成功"}}
1224
- * @memberof AuthenticationClient
1225
- */
1226
- AuthenticationClient.prototype.unLinkAccount = function (options) {
1227
- return __awaiter(this, void 0, void 0, function () {
1228
- return __generator(this, function (_a) {
1229
- switch (_a.label) {
1230
- case 0: return [4 /*yield*/, this.httpClient.request({
1231
- method: 'POST',
1232
- url: this.baseClient.appHost + "/api/v2/users/unlink",
1233
- data: {
1234
- primaryUserToken: options.primaryUserToken,
1235
- provider: options.provider
1236
- }
1237
- })];
1238
- case 1:
1239
- _a.sent();
1240
- return [2 /*return*/, { code: 200, message: '解绑成功' }];
1241
- }
1242
- });
1243
- });
1244
- };
1245
- /**
1246
- * @name bindPhone
1247
- * @name_zh 绑定手机号
1248
- * @description 用户初次绑定手机号,如果需要修改手机号请使用 updatePhone 接口。
1249
- *
1250
- * @param {string} phone
1251
- * @param {string} phoneCode
1252
- *
1253
- * @example
1254
- *
1255
- * authenticationClient.bindPhone('176xxxx7041', '1234')
1256
- *
1257
- * @returns {Promise<User>}
1258
- * @memberof AuthenticationClient
1259
- */
1260
- AuthenticationClient.prototype.bindPhone = function (phone, phoneCode) {
1261
- return __awaiter(this, void 0, void 0, function () {
1262
- var user;
1263
- return __generator(this, function (_a) {
1264
- switch (_a.label) {
1265
- case 0: return [4 /*yield*/, graphqlapi_1.bindPhone(this.graphqlClient, this.tokenProvider, {
1266
- phone: phone,
1267
- phoneCode: phoneCode
1268
- })];
1269
- case 1:
1270
- user = (_a.sent()).bindPhone;
1271
- this.setCurrentUser(user);
1272
- return [2 /*return*/, user];
1273
- }
1274
- });
1275
- });
1276
- };
1277
- /**
1278
- * @name unbindPhone
1279
- * @name_zh 解绑手机号
1280
- * @description 用户解绑手机号
1281
- *
1282
- * @example
1283
- *
1284
- * authenticationClient.unbindPhone()
1285
- *
1286
- * @returns {Promise<User>}
1287
- * @memberof AuthenticationClient
1288
- */
1289
- AuthenticationClient.prototype.unbindPhone = function () {
1290
- return __awaiter(this, void 0, void 0, function () {
1291
- var user;
1292
- return __generator(this, function (_a) {
1293
- switch (_a.label) {
1294
- case 0: return [4 /*yield*/, graphqlapi_1.unbindPhone(this.graphqlClient, this.tokenProvider, {})];
1295
- case 1:
1296
- user = (_a.sent()).unbindPhone;
1297
- this.setCurrentUser(user);
1298
- return [2 /*return*/, user];
1299
- }
1300
- });
1301
- });
1302
- };
1303
- /**
1304
- * @name bindEmail
1305
- * @name_zh 绑定邮箱号
1306
- * @description 用户邮箱号
1307
- *
1308
- * @param {string} email
1309
- * @param {string} emailCode
1310
- *
1311
- * @example
1312
- *
1313
- * authenticationClient.bindEmail('test@example.com', '1234')
1314
- *
1315
- * @returns {Promise<User>}
1316
- * @memberof AuthenticationClient
1317
- */
1318
- AuthenticationClient.prototype.bindEmail = function (email, emailCode) {
1319
- return __awaiter(this, void 0, void 0, function () {
1320
- var user;
1321
- return __generator(this, function (_a) {
1322
- switch (_a.label) {
1323
- case 0: return [4 /*yield*/, graphqlapi_1.bindEmail(this.graphqlClient, this.tokenProvider, {
1324
- email: email,
1325
- emailCode: emailCode
1326
- })];
1327
- case 1:
1328
- user = (_a.sent()).bindEmail;
1329
- this.setCurrentUser(user);
1330
- return [2 /*return*/, user];
1331
- }
1332
- });
1333
- });
1334
- };
1335
- /**
1336
- * @name unbindEmail
1337
- * @name_zh 解绑邮箱号
1338
- * @description 用户解绑邮箱号
1339
- *
1340
- * @example
1341
- *
1342
- * authenticationClient.unbindPhone()
1343
- *
1344
- * @returns {Promise<User>}
1345
- * @memberof AuthenticationClient
1346
- */
1347
- AuthenticationClient.prototype.unbindEmail = function () {
1348
- return __awaiter(this, void 0, void 0, function () {
1349
- var user;
1350
- return __generator(this, function (_a) {
1351
- switch (_a.label) {
1352
- case 0: return [4 /*yield*/, graphqlapi_1.unbindEmail(this.graphqlClient, this.tokenProvider, {})];
1353
- case 1:
1354
- user = (_a.sent()).unbindEmail;
1355
- this.setCurrentUser(user);
1356
- return [2 /*return*/, user];
1357
- }
1358
- });
1359
- });
1360
- };
1361
- /**
1362
- * @name getCurrentUser
1363
- * @name_zh 获取当前登录的用户信息
1364
- * @description 获取当前登录的用户信息
1365
- *
1366
- * @example
1367
- *
1368
- * authenticationClient.getCurrentUser()
1369
- *
1370
- * @returns {Promise<User>}
1371
- * @memberof AuthenticationClient
1372
- */
1373
- AuthenticationClient.prototype.getCurrentUser = function () {
1374
- return __awaiter(this, void 0, void 0, function () {
1375
- var data, _a;
1376
- return __generator(this, function (_b) {
1377
- switch (_b.label) {
1378
- case 0:
1379
- _b.trys.push([0, 2, , 3]);
1380
- return [4 /*yield*/, graphqlapi_1.user(this.graphqlClient, this.tokenProvider, {})];
1381
- case 1:
1382
- data = (_b.sent()).user;
1383
- this.setCurrentUser(data);
1384
- return [2 /*return*/, data];
1385
- case 2:
1386
- _a = _b.sent();
1387
- return [2 /*return*/, null];
1388
- case 3: return [2 /*return*/];
1389
- }
1390
- });
1391
- });
1392
- };
1393
- /**
1394
- * @name logout
1395
- * @name_zh 退出登录
1396
- * @description 退出登录,清空 localStorage 里的 user 和 token
1397
- *
1398
- * @example
1399
- *
1400
- * authenticationClient.logout()
1401
- *
1402
- * @returns {null}
1403
- * @memberof AuthenticationClient
1404
- */
1405
- AuthenticationClient.prototype.logout = function () {
1406
- return __awaiter(this, void 0, void 0, function () {
1407
- return __generator(this, function (_a) {
1408
- switch (_a.label) {
1409
- case 0: return [4 /*yield*/, this.httpClient.request({
1410
- method: 'GET',
1411
- url: this.baseClient.appHost + "/api/v2/logout?app_id=" + this.options.appId,
1412
- withCredentials: true
1413
- })];
1414
- case 1:
1415
- _a.sent();
1416
- this.tokenProvider.clearUser();
1417
- return [2 /*return*/];
1418
- }
1419
- });
1420
- });
1421
- };
1422
- /**
1423
- * @name listUdv
1424
- * @name_zh 获取当前用户的自定义数据列表
1425
- * @description 获取当前用户的自定义数据列表
1426
- * @deprecated use getUdfValue instead
1427
- *
1428
- * @example
1429
- *
1430
- * authenticationClient.listUdv()
1431
- *
1432
- * @returns {Promise<Array<UserDefinedData>>}
1433
- * @memberof AuthenticationClient
1434
- */
1435
- AuthenticationClient.prototype.listUdv = function () {
1436
- return __awaiter(this, void 0, void 0, function () {
1437
- var userId, list;
1438
- return __generator(this, function (_a) {
1439
- switch (_a.label) {
1440
- case 0:
1441
- userId = this.checkLoggedIn();
1442
- return [4 /*yield*/, graphqlapi_1.udv(this.graphqlClient, this.tokenProvider, {
1443
- targetType: graphql_v2_1.UdfTargetType.User,
1444
- targetId: userId
1445
- })];
1446
- case 1:
1447
- list = (_a.sent()).udv;
1448
- return [2 /*return*/, utils_1.convertUdv(list)];
1449
- }
1450
- });
1451
- });
1452
- };
1453
- /**
1454
- * @name setUdv
1455
- * @name_zh 添加自定义数据
1456
- * @description 添加自定义数据
1457
- *
1458
- * @param {string} key 自定义字段的 key
1459
- * @param {any} value 自定义数据的值,值的类型必须要和用户池定义的自定义字段类型一致。
1460
- *
1461
- * @example
1462
- *
1463
- * authenticationClient.setUdv('school', '清华大学') // 要求用户必须定义了 school 这个字段。
1464
- *
1465
- * @returns {Promise<Array<UserDefinedData>>}
1466
- * @memberof AuthenticationClient
1467
- */
1468
- AuthenticationClient.prototype.setUdv = function (key, value) {
1469
- return __awaiter(this, void 0, void 0, function () {
1470
- var userId, list;
1471
- return __generator(this, function (_a) {
1472
- switch (_a.label) {
1473
- case 0:
1474
- userId = this.checkLoggedIn();
1475
- value = JSON.stringify(value);
1476
- return [4 /*yield*/, graphqlapi_1.setUdv(this.graphqlClient, this.tokenProvider, {
1477
- targetType: graphql_v2_1.UdfTargetType.User,
1478
- targetId: userId,
1479
- key: key,
1480
- value: value
1481
- })];
1482
- case 1:
1483
- list = (_a.sent()).setUdv;
1484
- return [2 /*return*/, utils_1.convertUdv(list)];
1485
- }
1486
- });
1487
- });
1488
- };
1489
- /**
1490
- * @name removeUdv
1491
- * @name_zh 删除自定义数据
1492
- * @description 删除自定义数据
1493
- *
1494
- * @param key 自定义字段的 key
1495
- *
1496
- * @example
1497
- *
1498
- * authenticationClient.removeUdv('school')
1499
- *
1500
- *
1501
- * @returns {Promise<Array<UserDefinedData>>}
1502
- * @memberof AuthenticationClient
1503
- */
1504
- AuthenticationClient.prototype.removeUdv = function (key) {
1505
- return __awaiter(this, void 0, void 0, function () {
1506
- var userId, list;
1507
- return __generator(this, function (_a) {
1508
- switch (_a.label) {
1509
- case 0:
1510
- userId = this.checkLoggedIn();
1511
- return [4 /*yield*/, graphqlapi_1.removeUdv(this.graphqlClient, this.tokenProvider, {
1512
- targetType: graphql_v2_1.UdfTargetType.User,
1513
- targetId: userId,
1514
- key: key
1515
- })];
1516
- case 1:
1517
- list = (_a.sent()).removeUdv;
1518
- return [2 /*return*/, utils_1.convertUdv(list)];
1519
- }
1520
- });
1521
- });
1522
- };
1523
- /**
1524
- * @name listOrg
1525
- * @name_zh 获取用户所在组织机构
1526
- * @description 获取用户所在的组织机构立碑,以及他所属的节点在此组织机构内的完整路径。
1527
- *
1528
- * @example
1529
- *
1530
- * const data = await authenticationClient.listOrgs();
1531
- *
1532
- * @returns {Promise<UserOrgList>}
1533
- *
1534
- * @memberof AuthenticationClient
1535
- */
1536
- AuthenticationClient.prototype.listOrgs = function () {
1537
- return __awaiter(this, void 0, void 0, function () {
1538
- return __generator(this, function (_a) {
1539
- switch (_a.label) {
1540
- case 0: return [4 /*yield*/, this.httpClient.request({
1541
- method: 'GET',
1542
- url: this.baseClient.appHost + "/api/v2/users/me/orgs"
1543
- })];
1544
- case 1: return [2 /*return*/, _a.sent()];
1545
- }
1546
- });
1547
- });
1548
- };
1549
- /**
1550
- * @description 获取用户
1551
- *
1552
- */
1553
- AuthenticationClient.prototype.listDepartments = function () {
1554
- return __awaiter(this, void 0, void 0, function () {
1555
- var userId, departments;
1556
- return __generator(this, function (_a) {
1557
- switch (_a.label) {
1558
- case 0:
1559
- userId = this.checkLoggedIn();
1560
- return [4 /*yield*/, graphqlapi_1.getUserDepartments(this.graphqlClient, this.tokenProvider, {
1561
- id: userId
1562
- })];
1563
- case 1:
1564
- departments = (_a.sent()).user.departments;
1565
- return [2 /*return*/, departments];
1566
- }
1567
- });
1568
- });
1569
- };
1570
- /**
1571
- * @name loginByLdap
1572
- * @name_zh 使用 LDAP 用户名登录
1573
- * @description 使用 LDAP 用户名登录。
1574
- *
1575
- * 如果你的用户池配置了登录失败检测,当同一 IP 下登录多次失败的时候会要求用户输入图形验证码(code 为 2000)。
1576
- *
1577
- * @param {string} username 用户名
1578
- * @param {string} password 密码
1579
- * @param {Object} [options]
1580
- * @param {boolean} [options.autoRegister] 是否自动注册。如果检测到用户不存在,会根据登录账密自动创建一个账号。
1581
- * @param {string} [options.captchaCode] 图形验证码
1582
- * @param {string} [options.clientIp] 客户端真实 IP,如果你在服务器端调用此接口,请务必将此参数设置为终端用户的真实 IP。
1583
- *
1584
- *
1585
- * @example
1586
- * const authenticationClient = new AuthenticationClient({
1587
- * appId: '应用 ID'
1588
- * })
1589
- *
1590
- * authenticationClient.loginByLdap(
1591
- * 'admin',
1592
- * 'admin',
1593
- * )
1594
- *
1595
- *
1596
- * @returns {Promise<User>}
1597
- * @memberof AuthenticationClient
1598
- */
1599
- AuthenticationClient.prototype.loginByLdap = function (username, password, options) {
1600
- return __awaiter(this, void 0, void 0, function () {
1601
- var api, user;
1602
- return __generator(this, function (_a) {
1603
- switch (_a.label) {
1604
- case 0:
1605
- options = options || {};
1606
- api = this.baseClient.appHost + "/api/v2/ldap/verify-user";
1607
- return [4 /*yield*/, this.httpClient.request({
1608
- method: 'POST',
1609
- url: api,
1610
- data: {
1611
- username: username,
1612
- password: password
1613
- }
1614
- })];
1615
- case 1:
1616
- user = _a.sent();
1617
- this.setCurrentUser(user);
1618
- return [2 /*return*/, user];
1619
- }
1620
- });
1621
- });
1622
- };
1623
- /**
1624
- * @name loginByAd
1625
- * @name_zh 使用 AD 用户名登录
1626
- * @description 使用 AD 用户名登录。
1627
- *
1628
- * @param {string} username 用户名
1629
- * @param {string} password 密码
1630
- *
1631
- *
1632
- * @example
1633
- * const authenticationClient = new AuthenticationClient({
1634
- * appId: '应用 ID'
1635
- * })
1636
- *
1637
- * authenticationClient.loginByAd(
1638
- * 'admin',
1639
- * 'admin',
1640
- * )
1641
- *
1642
- * @returns {Promise<User>}
1643
- * @memberof AuthenticationClient
1644
- */
1645
- AuthenticationClient.prototype.loginByAd = function (username, password) {
1646
- return __awaiter(this, void 0, void 0, function () {
1647
- var firstLevelDomain, websocketHost, api, user;
1648
- return __generator(this, function (_a) {
1649
- switch (_a.label) {
1650
- case 0:
1651
- firstLevelDomain = new URL(this.baseClient.appHost).hostname
1652
- .split('.')
1653
- .slice(1)
1654
- .join('.');
1655
- websocketHost = this.options.websocketHost || "https://ws." + firstLevelDomain;
1656
- api = websocketHost + "/api/v2/ad/verify-user";
1657
- return [4 /*yield*/, this.httpClient.request({
1658
- method: 'POST',
1659
- url: api,
1660
- data: {
1661
- username: username,
1662
- password: password
1663
- }
1664
- })];
1665
- case 1:
1666
- user = _a.sent();
1667
- this.setCurrentUser(user);
1668
- return [2 /*return*/, user];
1669
- }
1670
- });
1671
- });
1672
- };
1673
- /**
1674
- * @description 上传图片
1675
- */
1676
- AuthenticationClient.prototype.uploadPhoto = function (accept, cb) {
1677
- accept = accept || 'image/*';
1678
- var authing = this;
1679
- utils_1.uploadFile({
1680
- accept: accept,
1681
- url: this.baseClient.appHost + "/api/v2/upload?folder=avatar"
1682
- })
1683
- .then(function (_a) {
1684
- var url = _a.url;
1685
- return cb(url);
1686
- })
1687
- .catch(function (_a) {
1688
- var code = _a.code, message = _a.message;
1689
- return authing.options.onError(code, message);
1690
- });
1691
- };
1692
- /**
1693
- * @deprecated use uploadAvatar instead
1694
- * @description 更新用户头像
1695
- */
1696
- AuthenticationClient.prototype.updateAvatar = function (options) {
1697
- return __awaiter(this, void 0, void 0, function () {
1698
- return __generator(this, function (_a) {
1699
- switch (_a.label) {
1700
- case 0: return [4 /*yield*/, this.uploadAvatar(options)];
1701
- case 1: return [2 /*return*/, _a.sent()];
1702
- }
1703
- });
1704
- });
1705
- };
1706
- /**
1707
- * @description 一键上传图片并更新用户头像
1708
- *
1709
- * @param {Object} options
1710
- * @param {string} options.accept 支持的图片格式,默认为 'image/*'
1711
- *
1712
- * @example
1713
- * const authenticationClient = new AuthenticationClient({
1714
- * appId: 'APP_ID',
1715
- * appHost: 'https://xxx.authing.cn'
1716
- * })
1717
- *
1718
- * // 会自动打开浏览器文件上传框,并自动完成图片文件上传 CDN、修改用户头像操作。
1719
- * authenticationClient.uploadAvatar()
1720
- *
1721
- * // 只支持 png 格式图片
1722
- * authenticationClient.uploadAvatar({
1723
- * accept: '.png'
1724
- * })
1725
- *
1726
- * @returns
1727
- */
1728
- AuthenticationClient.prototype.uploadAvatar = function (options) {
1729
- return __awaiter(this, void 0, void 0, function () {
1730
- var accept, task, src, user;
1731
- var _this = this;
1732
- return __generator(this, function (_a) {
1733
- switch (_a.label) {
1734
- case 0:
1735
- accept = (options || {}).accept;
1736
- this.checkLoggedIn();
1737
- task = new Promise(function (resolve) {
1738
- _this.uploadPhoto(accept, function (src) {
1739
- resolve(src);
1740
- });
1741
- });
1742
- return [4 /*yield*/, task];
1743
- case 1:
1744
- src = _a.sent();
1745
- return [4 /*yield*/, this.updateProfile({ photo: src })];
1746
- case 2:
1747
- user = _a.sent();
1748
- this.setCurrentUser(user);
1749
- return [2 /*return*/, user];
1750
- }
1751
- });
1752
- });
1753
- };
1754
- /**
1755
- * @description 获取当前用户的所有自定义数据
1756
- *
1757
- */
1758
- AuthenticationClient.prototype.getUdfValue = function () {
1759
- return __awaiter(this, void 0, void 0, function () {
1760
- var userId, list;
1761
- return __generator(this, function (_a) {
1762
- switch (_a.label) {
1763
- case 0:
1764
- userId = this.checkLoggedIn();
1765
- return [4 /*yield*/, graphqlapi_1.udv(this.graphqlClient, this.tokenProvider, {
1766
- targetType: graphql_v2_1.UdfTargetType.User,
1767
- targetId: userId
1768
- })];
1769
- case 1:
1770
- list = (_a.sent()).udv;
1771
- return [2 /*return*/, utils_1.convertUdvToKeyValuePair(list)];
1772
- }
1773
- });
1774
- });
1775
- };
1776
- /**
1777
- * @description 设置自定义字段值
1778
- *
1779
- */
1780
- AuthenticationClient.prototype.setUdfValue = function (data) {
1781
- return __awaiter(this, void 0, void 0, function () {
1782
- var userId;
1783
- return __generator(this, function (_a) {
1784
- switch (_a.label) {
1785
- case 0:
1786
- if (Object.keys(data).length === 0) {
1787
- throw new Error('empty udf value list');
1788
- }
1789
- userId = this.checkLoggedIn();
1790
- return [4 /*yield*/, graphqlapi_1.setUdvBatch(this.graphqlClient, this.tokenProvider, {
1791
- targetType: graphql_v2_1.UdfTargetType.User,
1792
- targetId: userId,
1793
- udvList: Object.keys(data).map(function (key) { return ({
1794
- key: key,
1795
- value: JSON.stringify(data[key])
1796
- }); })
1797
- })];
1798
- case 1:
1799
- _a.sent();
1800
- return [2 /*return*/];
1801
- }
1802
- });
1803
- });
1804
- };
1805
- /**
1806
- * @description 删除用户自定义数据
1807
- */
1808
- AuthenticationClient.prototype.removeUdfValue = function (key) {
1809
- return __awaiter(this, void 0, void 0, function () {
1810
- var userId;
1811
- return __generator(this, function (_a) {
1812
- switch (_a.label) {
1813
- case 0:
1814
- userId = this.checkLoggedIn();
1815
- return [4 /*yield*/, graphqlapi_1.removeUdv(this.graphqlClient, this.tokenProvider, {
1816
- targetType: graphql_v2_1.UdfTargetType.User,
1817
- targetId: userId,
1818
- key: key
1819
- })];
1820
- case 1:
1821
- _a.sent();
1822
- return [2 /*return*/];
1823
- }
1824
- });
1825
- });
1826
- };
1827
- /**
1828
- * @name getSecurityLevel
1829
- * @name_zh 用户安全等级
1830
- * @description 获取用户的安全等级评分
1831
- *
1832
- * @example
1833
- *
1834
- * const data = await authenticationClient.getSecurityLevel();
1835
- *
1836
- * @returns {Promise<SecurityLevel>}
1837
- *
1838
- * @memberof AuthenticationClient
1839
- */
1840
- AuthenticationClient.prototype.getSecurityLevel = function () {
1841
- return __awaiter(this, void 0, void 0, function () {
1842
- return __generator(this, function (_a) {
1843
- switch (_a.label) {
1844
- case 0: return [4 /*yield*/, this.httpClient.request({
1845
- method: 'GET',
1846
- url: this.baseClient.appHost + "/api/v2/users/me/security-level"
1847
- })];
1848
- case 1: return [2 /*return*/, _a.sent()];
1849
- }
1850
- });
1851
- });
1852
- };
1853
- /**
1854
- * @description 获取用户被授权的所有资源
1855
- *
1856
- * @param userId
1857
- * @param namespace
1858
- */
1859
- AuthenticationClient.prototype.listAuthorizedResources = function (namespace, options) {
1860
- return __awaiter(this, void 0, void 0, function () {
1861
- var userId, resourceType, user, _a, list, totalCount;
1862
- return __generator(this, function (_b) {
1863
- switch (_b.label) {
1864
- case 0:
1865
- userId = this.checkLoggedIn();
1866
- resourceType = (options || {}).resourceType;
1867
- return [4 /*yield*/, graphqlapi_1.listUserAuthorizedResources(this.graphqlClient, this.tokenProvider, {
1868
- id: userId,
1869
- namespace: namespace,
1870
- resourceType: resourceType
1871
- })];
1872
- case 1:
1873
- user = (_b.sent()).user;
1874
- if (!user) {
1875
- throw new Error('用户不存在');
1876
- }
1877
- _a = user.authorizedResources, list = _a.list, totalCount = _a.totalCount;
1878
- list = utils_1.formatAuthorizedResources(list);
1879
- return [2 /*return*/, {
1880
- list: list,
1881
- totalCount: totalCount
1882
- }];
1883
- }
1884
- });
1885
- });
1886
- };
1887
- /**
1888
- * @name computedPasswordSecurityLevel
1889
- * @name_zh 计算密码安全等级
1890
- * @description 计算密码安全等级
1891
- *
1892
- * @example
1893
- *
1894
- * const data = authenticationClient.computedPasswordSecurityLevel('xxxxxxxx');
1895
- *
1896
- * @returns {PasswordSecurityLevel}
1897
- *
1898
- * @memberof AuthenticationClient
1899
- */
1900
- AuthenticationClient.prototype.computedPasswordSecurityLevel = function (password) {
1901
- if (typeof password !== 'string') {
1902
- throw 'password must be a `string`';
1903
- }
1904
- var highLevel = new RegExp(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{12,}$/g);
1905
- var middleLevel = new RegExp(/^(?=.*[a-zA-Z])(?=.*\d)[^]{8,}$/g);
1906
- if (password.match(highLevel) !== null) {
1907
- return types_1.PasswordSecurityLevel.HIGH;
1908
- }
1909
- if (password.match(middleLevel) !== null) {
1910
- return types_1.PasswordSecurityLevel.MIDDLE;
1911
- }
1912
- return types_1.PasswordSecurityLevel.LOW;
1913
- };
1914
- AuthenticationClient.prototype._generateTokenRequest = function (params) {
1915
- var ret = {};
1916
- // 删掉所有 undefined 的 kv
1917
- Object.keys(params).map(function (key) {
1918
- if (typeof params[key] !== 'undefined') {
1919
- ret[key] = params[key];
1920
- }
1921
- });
1922
- var p = new URLSearchParams(ret);
1923
- return p.toString();
1924
- };
1925
- AuthenticationClient.prototype._generateBasicAuthToken = function (appId, secret) {
1926
- var id = appId || this.options.appId;
1927
- var s = secret || this.options.secret;
1928
- var token = 'Basic ' + Buffer.from(id + ':' + s).toString('base64');
1929
- return token;
1930
- };
1931
- /**
1932
- * @param {string} code 授权码 code
1933
- * @param {string} codeVerifier 校验码 codeVerifier
1934
- */
1935
- AuthenticationClient.prototype._getAccessTokenByCodeWithClientSecretPost = function (code, codeVerifier) {
1936
- return __awaiter(this, void 0, void 0, function () {
1937
- var qstr, api, tokenSet;
1938
- return __generator(this, function (_a) {
1939
- switch (_a.label) {
1940
- case 0:
1941
- qstr = this._generateTokenRequest({
1942
- client_id: this.options.appId,
1943
- client_secret: this.options.secret,
1944
- grant_type: 'authorization_code',
1945
- code: code,
1946
- redirect_uri: this.options.redirectUri,
1947
- code_verifier: codeVerifier
1948
- });
1949
- api = '';
1950
- if (this.options.protocol === 'oidc') {
1951
- api = this.baseClient.appHost + "/oidc/token";
1952
- }
1953
- else if (this.options.protocol === 'oauth') {
1954
- api = this.baseClient.appHost + "/oauth/token";
1955
- }
1956
- return [4 /*yield*/, this.naiveHttpClient.request({
1957
- method: 'POST',
1958
- url: api,
1959
- data: qstr,
1960
- headers: {
1961
- 'Content-Type': 'application/x-www-form-urlencoded'
1962
- }
1963
- })];
1964
- case 1:
1965
- tokenSet = _a.sent();
1966
- return [2 /*return*/, tokenSet];
1967
- }
1968
- });
1969
- });
1970
- };
1971
- /**
1972
- * @param {string} code 授权码 code
1973
- * @param {string} codeVerifier 校验码 codeVerifier
1974
- */
1975
- AuthenticationClient.prototype._getAccessTokenByCodeWithClientSecretBasic = function (code, codeVerifier) {
1976
- return __awaiter(this, void 0, void 0, function () {
1977
- var api, qstr, tokenSet;
1978
- return __generator(this, function (_a) {
1979
- switch (_a.label) {
1980
- case 0:
1981
- api = '';
1982
- if (this.options.protocol === 'oidc') {
1983
- api = this.baseClient.appHost + "/oidc/token";
1984
- }
1985
- else if (this.options.protocol === 'oauth') {
1986
- api = this.baseClient.appHost + "/oauth/token";
1987
- }
1988
- qstr = this._generateTokenRequest({
1989
- grant_type: 'authorization_code',
1990
- code: code,
1991
- redirect_uri: this.options.redirectUri,
1992
- code_verifier: codeVerifier
1993
- });
1994
- return [4 /*yield*/, this.naiveHttpClient.request({
1995
- data: qstr,
1996
- method: 'POST',
1997
- url: api,
1998
- headers: {
1999
- Authorization: this._generateBasicAuthToken()
2000
- }
2001
- })];
2002
- case 1:
2003
- tokenSet = _a.sent();
2004
- return [2 /*return*/, tokenSet];
2005
- }
2006
- });
2007
- });
2008
- };
2009
- /**
2010
- * @param {string} code 授权码 code
2011
- * @param {string} codeVerifier 校验码 codeVerifier
2012
- */
2013
- AuthenticationClient.prototype._getAccessTokenByCodeWithNone = function (code, codeVerifier) {
2014
- return __awaiter(this, void 0, void 0, function () {
2015
- var api, qstr, tokenSet;
2016
- return __generator(this, function (_a) {
2017
- switch (_a.label) {
2018
- case 0:
2019
- api = '';
2020
- if (this.options.protocol === 'oidc') {
2021
- api = this.baseClient.appHost + "/oidc/token";
2022
- }
2023
- else if (this.options.protocol === 'oauth') {
2024
- api = this.baseClient.appHost + "/oauth/token";
2025
- }
2026
- qstr = this._generateTokenRequest({
2027
- client_id: this.options.appId,
2028
- grant_type: 'authorization_code',
2029
- code: code,
2030
- redirect_uri: this.options.redirectUri,
2031
- code_verifier: codeVerifier
2032
- });
2033
- return [4 /*yield*/, this.naiveHttpClient.request({
2034
- method: 'POST',
2035
- url: api,
2036
- data: qstr
2037
- })];
2038
- case 1:
2039
- tokenSet = _a.sent();
2040
- return [2 /*return*/, tokenSet];
2041
- }
2042
- });
2043
- });
2044
- };
2045
- AuthenticationClient.prototype.getAccessTokenByCode = function (code, options) {
2046
- return __awaiter(this, void 0, void 0, function () {
2047
- return __generator(this, function (_a) {
2048
- switch (_a.label) {
2049
- case 0:
2050
- if (!['oauth', 'oidc'].includes(this.options.protocol)) {
2051
- throw new Error('初始化 AuthenticationClient 时传入的 protocol 参数必须为 oauth 或 oidc,请检查参数');
2052
- }
2053
- if (!this.options.secret &&
2054
- this.options.tokenEndPointAuthMethod !== 'none') {
2055
- throw new Error('请在初始化 AuthenticationClient 时传入 appId 和 secret 参数');
2056
- }
2057
- if (!(this.options.tokenEndPointAuthMethod === 'client_secret_post')) return [3 /*break*/, 2];
2058
- return [4 /*yield*/, this._getAccessTokenByCodeWithClientSecretPost(code, options === null || options === void 0 ? void 0 : options.codeVerifier)];
2059
- case 1: return [2 /*return*/, _a.sent()];
2060
- case 2:
2061
- if (!(this.options.tokenEndPointAuthMethod === 'client_secret_basic')) return [3 /*break*/, 4];
2062
- return [4 /*yield*/, this._getAccessTokenByCodeWithClientSecretBasic(code, options === null || options === void 0 ? void 0 : options.codeVerifier)];
2063
- case 3: return [2 /*return*/, _a.sent()];
2064
- case 4:
2065
- if (!(this.options.tokenEndPointAuthMethod === 'none')) return [3 /*break*/, 6];
2066
- return [4 /*yield*/, this._getAccessTokenByCodeWithNone(code, options === null || options === void 0 ? void 0 : options.codeVerifier)];
2067
- case 5: return [2 /*return*/, _a.sent()];
2068
- case 6: return [2 /*return*/];
2069
- }
2070
- });
2071
- });
2072
- };
2073
- AuthenticationClient.prototype.generateCodeChallenge = function () {
2074
- return utils_1.generateRandomString(43);
2075
- };
2076
- AuthenticationClient.prototype.getCodeChallengeDigest = function (options) {
2077
- if (!options) {
2078
- throw new Error('请提供 options 参数,options.codeChallenge 为一个长度大于等于 43 的字符串,options.method 可选值为 S256、plain');
2079
- }
2080
- if (!options.codeChallenge) {
2081
- throw new Error('请提供 options.codeChallenge,值为一个长度大于等于 43 的字符串');
2082
- }
2083
- var _a = options.method, method = _a === void 0 ? 'S256' : _a;
2084
- if (method === 'S256') {
2085
- // url safe base64
2086
- return sha256_1.default(options.codeChallenge)
2087
- .toString(crypto_js_1.default.enc.Base64)
2088
- .replace(/\+/g, '-')
2089
- .replace(/\//g, '_')
2090
- .replace(/=/g, '');
2091
- }
2092
- if (method === 'plain') {
2093
- return options.codeChallenge;
2094
- }
2095
- throw new Error('不支持的 options.method,可选值为 S256、plain');
2096
- };
2097
- AuthenticationClient.prototype.getAccessTokenByClientCredentials = function (scope, options) {
2098
- return __awaiter(this, void 0, void 0, function () {
2099
- var i, s, qstr, api, tokenSet;
2100
- return __generator(this, function (_a) {
2101
- switch (_a.label) {
2102
- case 0:
2103
- if (!scope) {
2104
- throw new Error('请传入 scope 参数,请看文档:https://docs.authing.cn/v2/guides/authorization/m2m-authz.html');
2105
- }
2106
- if (!options) {
2107
- throw new Error('请在调用本方法时传入 { accessKey: string, accessSecret: string },请看文档:https://docs.authing.cn/v2/guides/authorization/m2m-authz.html'
2108
- // '请在初始化 AuthenticationClient 时传入 appId 和 secret 参数或者在调用本方法时传入 { accessKey: string, accessSecret: string },请看文档:https://docs.authing.cn/v2/guides/authorization/m2m-authz.html'
2109
- );
2110
- }
2111
- i = (options === null || options === void 0 ? void 0 : options.accessKey) || this.options.appId;
2112
- s = (options === null || options === void 0 ? void 0 : options.accessSecret) || this.options.secret;
2113
- qstr = this._generateTokenRequest({
2114
- client_id: i,
2115
- client_secret: s,
2116
- grant_type: 'client_credentials',
2117
- scope: scope
2118
- });
2119
- api = '';
2120
- if (this.options.protocol === 'oidc') {
2121
- api = this.baseClient.appHost + "/oidc/token";
2122
- }
2123
- else if (this.options.protocol === 'oauth') {
2124
- api = this.baseClient.appHost + "/oauth/token";
2125
- }
2126
- return [4 /*yield*/, this.naiveHttpClient.request({
2127
- method: 'POST',
2128
- url: api,
2129
- data: qstr,
2130
- headers: {
2131
- 'Content-Type': 'application/x-www-form-urlencoded'
2132
- }
2133
- })];
2134
- case 1:
2135
- tokenSet = _a.sent();
2136
- return [2 /*return*/, tokenSet];
2137
- }
2138
- });
2139
- });
2140
- };
2141
- AuthenticationClient.prototype.getUserInfoByAccessToken = function (accessToken, options) {
2142
- return __awaiter(this, void 0, void 0, function () {
2143
- var api, userInfo, userInfo, userInfo, userInfo, userInfo, userInfo;
2144
- return __generator(this, function (_a) {
2145
- switch (_a.label) {
2146
- case 0:
2147
- if (options) {
2148
- if (options.method && !['POST', 'GET'].includes(options.method)) {
2149
- throw new Error('options.method 参数的可选值为 POST、GET,请检查输入');
2150
- }
2151
- if (options.tokenPlace &&
2152
- !['query', 'header', 'body'].includes(options.tokenPlace)) {
2153
- throw new Error('options.tokenPlace 参数的可选值为 query、header、body,请检查输入');
2154
- }
2155
- if (options.method === 'GET' && options.tokenPlace === 'body') {
2156
- throw new Error('options.method 参数为 GET 时,options.tokenPlace 参数不能为 body');
2157
- }
2158
- options.method = options.method || 'GET';
2159
- options.tokenPlace = options.tokenPlace || 'query';
2160
- }
2161
- api = '';
2162
- if (this.options.protocol === 'oidc') {
2163
- api = this.baseClient.appHost + "/oidc/me";
2164
- }
2165
- else if (this.options.protocol === 'oauth') {
2166
- api = this.baseClient.appHost + "/oauth/me";
2167
- }
2168
- if (!((options === null || options === void 0 ? void 0 : options.method) === 'POST')) return [3 /*break*/, 7];
2169
- if (!((options === null || options === void 0 ? void 0 : options.tokenPlace) === 'header')) return [3 /*break*/, 2];
2170
- return [4 /*yield*/, this.naiveHttpClient.request({
2171
- method: 'POST',
2172
- url: api,
2173
- headers: {
2174
- Authorization: 'Bearer ' + accessToken
2175
- }
2176
- })];
2177
- case 1:
2178
- userInfo = _a.sent();
2179
- return [2 /*return*/, userInfo];
2180
- case 2:
2181
- if (!((options === null || options === void 0 ? void 0 : options.tokenPlace) === 'query')) return [3 /*break*/, 4];
2182
- return [4 /*yield*/, this.naiveHttpClient.request({
2183
- method: 'POST',
2184
- url: api,
2185
- params: {
2186
- access_token: accessToken
2187
- }
2188
- })];
2189
- case 3:
2190
- userInfo = _a.sent();
2191
- return [2 /*return*/, userInfo];
2192
- case 4:
2193
- if (!((options === null || options === void 0 ? void 0 : options.tokenPlace) === 'body')) return [3 /*break*/, 6];
2194
- return [4 /*yield*/, this.naiveHttpClient.request({
2195
- method: 'POST',
2196
- url: api,
2197
- data: utils_1.objectToQueryString({
2198
- access_token: accessToken
2199
- }).slice(1)
2200
- })];
2201
- case 5:
2202
- userInfo = _a.sent();
2203
- return [2 /*return*/, userInfo];
2204
- case 6: return [3 /*break*/, 14];
2205
- case 7:
2206
- if (!((options === null || options === void 0 ? void 0 : options.method) === 'GET')) return [3 /*break*/, 12];
2207
- if (!((options === null || options === void 0 ? void 0 : options.tokenPlace) === 'header')) return [3 /*break*/, 9];
2208
- return [4 /*yield*/, this.naiveHttpClient.request({
2209
- method: 'GET',
2210
- url: api,
2211
- headers: {
2212
- Authorization: 'Bearer ' + accessToken
2213
- }
2214
- })];
2215
- case 8:
2216
- userInfo = _a.sent();
2217
- return [2 /*return*/, userInfo];
2218
- case 9:
2219
- if (!((options === null || options === void 0 ? void 0 : options.tokenPlace) === 'query')) return [3 /*break*/, 11];
2220
- return [4 /*yield*/, this.naiveHttpClient.request({
2221
- method: 'GET',
2222
- url: api,
2223
- params: {
2224
- access_token: accessToken
2225
- }
2226
- })];
2227
- case 10:
2228
- userInfo = _a.sent();
2229
- return [2 /*return*/, userInfo];
2230
- case 11: return [3 /*break*/, 14];
2231
- case 12: return [4 /*yield*/, this.naiveHttpClient.request({
2232
- method: 'GET',
2233
- url: api,
2234
- params: {
2235
- access_token: accessToken
2236
- }
2237
- })];
2238
- case 13:
2239
- userInfo = _a.sent();
2240
- return [2 /*return*/, userInfo];
2241
- case 14: return [2 /*return*/];
2242
- }
2243
- });
2244
- });
2245
- };
2246
- AuthenticationClient.prototype.buildAuthorizeUrl = function (options) {
2247
- if (!this.baseClient.appHost) {
2248
- throw new Error('请在初始化 AuthenticationClient 时传入应用域名 appHost 参数,形如:https://app1.authing.cn');
2249
- }
2250
- if (this.options.protocol === 'oidc') {
2251
- return this._buildOidcAuthorizeUrl(options);
2252
- }
2253
- if (this.options.protocol === 'oauth') {
2254
- return this._buildOauthAuthorizeUrl(options);
2255
- }
2256
- if (this.options.protocol === 'saml') {
2257
- return this._buildSamlAuthorizeUrl();
2258
- }
2259
- if (this.options.protocol === 'cas') {
2260
- return this._buildCasAuthorizeUrl(options);
2261
- }
2262
- throw new Error('不支持的协议类型,请在初始化 AuthenticationClient 时传入 protocol 参数,可选值为 oidc、oauth、saml、cas');
2263
- };
2264
- AuthenticationClient.prototype._buildOidcAuthorizeUrl = function (options) {
2265
- var map = {
2266
- appId: 'client_id',
2267
- scope: 'scope',
2268
- state: 'state',
2269
- nonce: 'nonce',
2270
- responseMode: 'response_mode',
2271
- responseType: 'response_type',
2272
- redirectUri: 'redirect_uri',
2273
- codeChallenge: 'code_challenge',
2274
- codeChallengeMethod: 'code_challenge_method'
2275
- };
2276
- var res = {
2277
- nonce: Math.random()
2278
- .toString()
2279
- .slice(2),
2280
- state: Math.random()
2281
- .toString()
2282
- .slice(2),
2283
- scope: 'openid profile email phone address',
2284
- client_id: this.options.appId,
2285
- redirect_uri: this.options.redirectUri,
2286
- response_type: 'code'
2287
- };
2288
- Object.keys(map).forEach(function (k) {
2289
- if (options && options[k]) {
2290
- if (k === 'scope' && options.scope.includes('offline_access')) {
2291
- res.prompt = 'consent';
2292
- }
2293
- res[map[k]] = options[k];
2294
- }
2295
- });
2296
- var params = new URLSearchParams(res);
2297
- var authorizeUrl = this.baseClient.appHost + '/oidc/auth?' + params.toString();
2298
- return authorizeUrl;
2299
- };
2300
- AuthenticationClient.prototype._buildOauthAuthorizeUrl = function (options) {
2301
- var map = {
2302
- appId: 'client_id',
2303
- scope: 'scope',
2304
- state: 'state',
2305
- responseType: 'response_type',
2306
- redirectUri: 'redirect_uri'
2307
- };
2308
- var res = {
2309
- state: Math.random()
2310
- .toString()
2311
- .slice(2),
2312
- scope: 'user',
2313
- client_id: this.options.appId,
2314
- redirect_uri: this.options.redirectUri,
2315
- response_type: 'code'
2316
- };
2317
- Object.keys(map).forEach(function (k) {
2318
- if (options && options[k]) {
2319
- res[map[k]] = options[k];
2320
- }
2321
- });
2322
- var params = new URLSearchParams(res);
2323
- var authorizeUrl = this.baseClient.appHost + '/oauth/auth?' + params.toString();
2324
- return authorizeUrl;
2325
- };
2326
- AuthenticationClient.prototype._buildSamlAuthorizeUrl = function () {
2327
- return this.baseClient.appHost + '/api/v2/saml-idp/' + this.options.appId;
2328
- };
2329
- AuthenticationClient.prototype._buildCasAuthorizeUrl = function (options) {
2330
- if (options === null || options === void 0 ? void 0 : options.service) {
2331
- return this.baseClient.appHost + "/cas-idp/" + this.options.appId + "?service=" + (options === null || options === void 0 ? void 0 : options.service);
2332
- }
2333
- return this.baseClient.appHost + "/cas-idp/" + this.options.appId;
2334
- };
2335
- AuthenticationClient.prototype._buildCasLogoutUrl = function (options) {
2336
- if (options === null || options === void 0 ? void 0 : options.redirectUri) {
2337
- return (this.baseClient.appHost + '/cas-idp/logout?url=' + options.redirectUri);
2338
- }
2339
- return this.baseClient.appHost + "/cas-idp/logout";
2340
- };
2341
- AuthenticationClient.prototype._buildOidcLogoutUrl = function (options) {
2342
- if (options && !(options.idToken && options.redirectUri)) {
2343
- throw new Error('必须同时传入 idToken 和 redirectUri 参数,或者同时都不传入');
2344
- }
2345
- if (options === null || options === void 0 ? void 0 : options.redirectUri) {
2346
- return this.baseClient.appHost + "/oidc/session/end?id_token_hint=" + options.idToken + "&post_logout_redirect_uri=" + options.redirectUri;
2347
- }
2348
- return this.baseClient.appHost + "/oidc/session/end";
2349
- };
2350
- AuthenticationClient.prototype._buildEasyLogoutUrl = function (options) {
2351
- if (options === null || options === void 0 ? void 0 : options.redirectUri) {
2352
- return this.baseClient.appHost + "/login/profile/logout?redirect_uri=" + options.redirectUri;
2353
- }
2354
- return this.baseClient.appHost + "/login/profile/logout";
2355
- };
2356
- AuthenticationClient.prototype.buildLogoutUrl = function (options) {
2357
- if (this.options.protocol === 'cas') {
2358
- return this._buildCasLogoutUrl(options);
2359
- }
2360
- if (this.options.protocol === 'oidc' && (options === null || options === void 0 ? void 0 : options.expert)) {
2361
- return this._buildOidcLogoutUrl(options);
2362
- }
2363
- return this._buildEasyLogoutUrl(options);
2364
- };
2365
- AuthenticationClient.prototype._getNewAccessTokenByRefreshTokenWithClientSecretPost = function (refreshToken) {
2366
- return __awaiter(this, void 0, void 0, function () {
2367
- var qstr, api, tokenSet;
2368
- return __generator(this, function (_a) {
2369
- switch (_a.label) {
2370
- case 0:
2371
- qstr = this._generateTokenRequest({
2372
- client_id: this.options.appId,
2373
- client_secret: this.options.secret,
2374
- grant_type: 'refresh_token',
2375
- refresh_token: refreshToken
2376
- });
2377
- api = '';
2378
- if (this.options.protocol === 'oidc') {
2379
- api = this.baseClient.appHost + "/oidc/token";
2380
- }
2381
- else if (this.options.protocol === 'oauth') {
2382
- api = this.baseClient.appHost + "/oauth/token";
2383
- }
2384
- return [4 /*yield*/, this.naiveHttpClient.request({
2385
- method: 'POST',
2386
- url: api,
2387
- data: qstr,
2388
- headers: {
2389
- 'Content-Type': 'application/x-www-form-urlencoded'
2390
- }
2391
- })];
2392
- case 1:
2393
- tokenSet = _a.sent();
2394
- return [2 /*return*/, tokenSet];
2395
- }
2396
- });
2397
- });
2398
- };
2399
- AuthenticationClient.prototype._getNewAccessTokenByRefreshTokenWithClientSecretBasic = function (refreshToken) {
2400
- return __awaiter(this, void 0, void 0, function () {
2401
- var api, qstr, tokenSet;
2402
- return __generator(this, function (_a) {
2403
- switch (_a.label) {
2404
- case 0:
2405
- api = '';
2406
- if (this.options.protocol === 'oidc') {
2407
- api = this.baseClient.appHost + "/oidc/token";
2408
- }
2409
- else if (this.options.protocol === 'oauth') {
2410
- api = this.baseClient.appHost + "/oauth/token";
2411
- }
2412
- qstr = this._generateTokenRequest({
2413
- grant_type: 'refresh_token',
2414
- refresh_token: refreshToken
2415
- });
2416
- return [4 /*yield*/, this.naiveHttpClient.request({
2417
- data: qstr,
2418
- method: 'POST',
2419
- url: api,
2420
- headers: {
2421
- Authorization: this._generateBasicAuthToken()
2422
- }
2423
- })];
2424
- case 1:
2425
- tokenSet = _a.sent();
2426
- return [2 /*return*/, tokenSet];
2427
- }
2428
- });
2429
- });
2430
- };
2431
- AuthenticationClient.prototype._getNewAccessTokenByRefreshTokenWithNone = function (refreshToken) {
2432
- return __awaiter(this, void 0, void 0, function () {
2433
- var api, qstr, tokenSet;
2434
- return __generator(this, function (_a) {
2435
- switch (_a.label) {
2436
- case 0:
2437
- api = '';
2438
- if (this.options.protocol === 'oidc') {
2439
- api = this.baseClient.appHost + "/oidc/token";
2440
- }
2441
- else if (this.options.protocol === 'oauth') {
2442
- api = this.baseClient.appHost + "/oauth/token";
2443
- }
2444
- qstr = this._generateTokenRequest({
2445
- client_id: this.options.appId,
2446
- grant_type: 'refresh_token',
2447
- refresh_token: refreshToken
2448
- });
2449
- return [4 /*yield*/, this.naiveHttpClient.request({
2450
- method: 'POST',
2451
- url: api,
2452
- data: qstr
2453
- })];
2454
- case 1:
2455
- tokenSet = _a.sent();
2456
- return [2 /*return*/, tokenSet];
2457
- }
2458
- });
2459
- });
2460
- };
2461
- AuthenticationClient.prototype.getNewAccessTokenByRefreshToken = function (refreshToken) {
2462
- return __awaiter(this, void 0, void 0, function () {
2463
- return __generator(this, function (_a) {
2464
- switch (_a.label) {
2465
- case 0:
2466
- if (!['oauth', 'oidc'].includes(this.options.protocol)) {
2467
- throw new Error('初始化 AuthenticationClient 时传入的 protocol 参数必须为 oauth 或 oidc,请检查参数');
2468
- }
2469
- if (!this.options.secret &&
2470
- this.options.tokenEndPointAuthMethod !== 'none') {
2471
- throw new Error('请在初始化 AuthenticationClient 时传入 appId 和 secret 参数');
2472
- }
2473
- if (!(this.options.tokenEndPointAuthMethod === 'client_secret_post')) return [3 /*break*/, 2];
2474
- return [4 /*yield*/, this._getNewAccessTokenByRefreshTokenWithClientSecretPost(refreshToken)];
2475
- case 1: return [2 /*return*/, _a.sent()];
2476
- case 2:
2477
- if (!(this.options.tokenEndPointAuthMethod === 'client_secret_basic')) return [3 /*break*/, 4];
2478
- return [4 /*yield*/, this._getNewAccessTokenByRefreshTokenWithClientSecretBasic(refreshToken)];
2479
- case 3: return [2 /*return*/, _a.sent()];
2480
- case 4:
2481
- if (!(this.options.tokenEndPointAuthMethod === 'none')) return [3 /*break*/, 6];
2482
- return [4 /*yield*/, this._getNewAccessTokenByRefreshTokenWithNone(refreshToken)];
2483
- case 5: return [2 /*return*/, _a.sent()];
2484
- case 6: return [2 /*return*/];
2485
- }
2486
- });
2487
- });
2488
- };
2489
- AuthenticationClient.prototype._revokeTokenWithClientSecretPost = function (token) {
2490
- return __awaiter(this, void 0, void 0, function () {
2491
- var qstr, api, tokenSet;
2492
- return __generator(this, function (_a) {
2493
- switch (_a.label) {
2494
- case 0:
2495
- qstr = this._generateTokenRequest({
2496
- client_id: this.options.appId,
2497
- client_secret: this.options.secret,
2498
- token: token
2499
- });
2500
- api = '';
2501
- if (this.options.protocol === 'oidc') {
2502
- api = this.baseClient.appHost + "/oidc/token/revocation";
2503
- }
2504
- else if (this.options.protocol === 'oauth') {
2505
- api = this.baseClient.appHost + "/oauth/token/revocation";
2506
- }
2507
- return [4 /*yield*/, this.naiveHttpClient.request({
2508
- method: 'POST',
2509
- url: api,
2510
- data: qstr,
2511
- headers: {
2512
- 'Content-Type': 'application/x-www-form-urlencoded'
2513
- }
2514
- })];
2515
- case 1:
2516
- tokenSet = _a.sent();
2517
- return [2 /*return*/, tokenSet];
2518
- }
2519
- });
2520
- });
2521
- };
2522
- AuthenticationClient.prototype._revokeTokenWithClientSecretBasic = function (token) {
2523
- return __awaiter(this, void 0, void 0, function () {
2524
- var api, qstr, result;
2525
- return __generator(this, function (_a) {
2526
- switch (_a.label) {
2527
- case 0:
2528
- api = '';
2529
- if (this.options.protocol === 'oidc') {
2530
- api = this.baseClient.appHost + "/oidc/token/revocation";
2531
- }
2532
- else if (this.options.protocol === 'oauth') {
2533
- throw new Error('OAuth 2.0 暂不支持用 client_secret_basic 模式身份验证撤回 Token');
2534
- api = this.baseClient.appHost + "/oauth/token/revocation";
2535
- }
2536
- qstr = this._generateTokenRequest({
2537
- token: token
2538
- });
2539
- return [4 /*yield*/, this.naiveHttpClient.request({
2540
- data: qstr,
2541
- method: 'POST',
2542
- url: api,
2543
- headers: {
2544
- Authorization: this._generateBasicAuthToken()
2545
- }
2546
- })];
2547
- case 1:
2548
- result = _a.sent();
2549
- return [2 /*return*/, result];
2550
- }
2551
- });
2552
- });
2553
- };
2554
- AuthenticationClient.prototype._revokeTokenWithNone = function (token) {
2555
- return __awaiter(this, void 0, void 0, function () {
2556
- var api, qstr, result;
2557
- return __generator(this, function (_a) {
2558
- switch (_a.label) {
2559
- case 0:
2560
- api = '';
2561
- if (this.options.protocol === 'oidc') {
2562
- api = this.baseClient.appHost + "/oidc/token/revocation";
2563
- }
2564
- else if (this.options.protocol === 'oauth') {
2565
- api = this.baseClient.appHost + "/oauth/token/revocation";
2566
- }
2567
- qstr = this._generateTokenRequest({
2568
- client_id: this.options.appId,
2569
- token: token
2570
- });
2571
- return [4 /*yield*/, this.naiveHttpClient.request({
2572
- method: 'POST',
2573
- url: api,
2574
- data: qstr
2575
- })];
2576
- case 1:
2577
- result = _a.sent();
2578
- return [2 /*return*/, result];
2579
- }
2580
- });
2581
- });
2582
- };
2583
- AuthenticationClient.prototype.revokeToken = function (token) {
2584
- return __awaiter(this, void 0, void 0, function () {
2585
- return __generator(this, function (_a) {
2586
- switch (_a.label) {
2587
- case 0:
2588
- if (!['oauth', 'oidc'].includes(this.options.protocol)) {
2589
- throw new Error('初始化 AuthenticationClient 时传入的 protocol 参数必须为 oauth 或 oidc,请检查参数');
2590
- }
2591
- if (!this.options.secret &&
2592
- this.options.revocationEndPointAuthMethod !== 'none') {
2593
- throw new Error('请在初始化 AuthenticationClient 时传入 appId 和 secret 参数');
2594
- }
2595
- if (!(this.options.revocationEndPointAuthMethod === 'client_secret_post')) return [3 /*break*/, 2];
2596
- return [4 /*yield*/, this._revokeTokenWithClientSecretPost(token)];
2597
- case 1:
2598
- _a.sent();
2599
- return [2 /*return*/, true];
2600
- case 2:
2601
- if (!(this.options.revocationEndPointAuthMethod === 'client_secret_basic')) return [3 /*break*/, 4];
2602
- return [4 /*yield*/, this._revokeTokenWithClientSecretBasic(token)];
2603
- case 3:
2604
- _a.sent();
2605
- return [2 /*return*/, true];
2606
- case 4:
2607
- if (!(this.options.revocationEndPointAuthMethod === 'none')) return [3 /*break*/, 6];
2608
- return [4 /*yield*/, this._revokeTokenWithNone(token)];
2609
- case 5:
2610
- _a.sent();
2611
- return [2 /*return*/, true];
2612
- case 6: throw new Error('初始化 AuthenticationClient 时传入的 revocationEndPointAuthMethod 参数可选值为 client_secret_base、client_secret_post、none,请检查参数');
2613
- }
2614
- });
2615
- });
2616
- };
2617
- AuthenticationClient.prototype._introspectTokenWithClientSecretPost = function (token) {
2618
- return __awaiter(this, void 0, void 0, function () {
2619
- var qstr, api, tokenSet;
2620
- return __generator(this, function (_a) {
2621
- switch (_a.label) {
2622
- case 0:
2623
- qstr = this._generateTokenRequest({
2624
- client_id: this.options.appId,
2625
- client_secret: this.options.secret,
2626
- token: token
2627
- });
2628
- api = '';
2629
- if (this.options.protocol === 'oidc') {
2630
- api = this.baseClient.appHost + "/oidc/token/introspection";
2631
- }
2632
- else if (this.options.protocol === 'oauth') {
2633
- api = this.baseClient.appHost + "/oauth/token/introspection";
2634
- }
2635
- return [4 /*yield*/, this.naiveHttpClient.request({
2636
- method: 'POST',
2637
- url: api,
2638
- data: qstr,
2639
- headers: {
2640
- 'Content-Type': 'application/x-www-form-urlencoded'
2641
- }
2642
- })];
2643
- case 1:
2644
- tokenSet = _a.sent();
2645
- return [2 /*return*/, tokenSet];
2646
- }
2647
- });
2648
- });
2649
- };
2650
- AuthenticationClient.prototype._introspectTokenWithClientSecretBasic = function (token) {
2651
- return __awaiter(this, void 0, void 0, function () {
2652
- var api, qstr, result;
2653
- return __generator(this, function (_a) {
2654
- switch (_a.label) {
2655
- case 0:
2656
- api = '';
2657
- if (this.options.protocol === 'oidc') {
2658
- api = this.baseClient.appHost + "/oidc/token/introspection";
2659
- }
2660
- else if (this.options.protocol === 'oauth') {
2661
- api = this.baseClient.appHost + "/oauth/token/introspection";
2662
- }
2663
- qstr = this._generateTokenRequest({
2664
- token: token
2665
- });
2666
- return [4 /*yield*/, this.naiveHttpClient.request({
2667
- data: qstr,
2668
- method: 'POST',
2669
- url: api,
2670
- headers: {
2671
- Authorization: this._generateBasicAuthToken()
2672
- }
2673
- })];
2674
- case 1:
2675
- result = _a.sent();
2676
- return [2 /*return*/, result];
2677
- }
2678
- });
2679
- });
2680
- };
2681
- AuthenticationClient.prototype._introspectTokenWithNone = function (token) {
2682
- return __awaiter(this, void 0, void 0, function () {
2683
- var api, qstr, result;
2684
- return __generator(this, function (_a) {
2685
- switch (_a.label) {
2686
- case 0:
2687
- api = '';
2688
- if (this.options.protocol === 'oidc') {
2689
- api = this.baseClient.appHost + "/oidc/token/introspection";
2690
- }
2691
- else if (this.options.protocol === 'oauth') {
2692
- api = this.baseClient.appHost + "/oauth/token/introspection";
2693
- }
2694
- qstr = this._generateTokenRequest({
2695
- client_id: this.options.appId,
2696
- token: token
2697
- });
2698
- return [4 /*yield*/, this.naiveHttpClient.request({
2699
- method: 'POST',
2700
- url: api,
2701
- data: qstr
2702
- })];
2703
- case 1:
2704
- result = _a.sent();
2705
- return [2 /*return*/, result];
2706
- }
2707
- });
2708
- });
2709
- };
2710
- AuthenticationClient.prototype.introspectToken = function (token) {
2711
- return __awaiter(this, void 0, void 0, function () {
2712
- return __generator(this, function (_a) {
2713
- switch (_a.label) {
2714
- case 0:
2715
- if (!['oauth', 'oidc'].includes(this.options.protocol)) {
2716
- throw new Error('初始化 AuthenticationClient 时传入的 protocol 参数必须为 oauth 或 oidc,请检查参数');
2717
- }
2718
- if (!this.options.secret &&
2719
- this.options.introspectionEndPointAuthMethod !== 'none') {
2720
- throw new Error('请在初始化 AuthenticationClient 时传入 appId 和 secret 参数');
2721
- }
2722
- if (!(this.options.introspectionEndPointAuthMethod === 'client_secret_post')) return [3 /*break*/, 2];
2723
- return [4 /*yield*/, this._introspectTokenWithClientSecretPost(token)];
2724
- case 1: return [2 /*return*/, _a.sent()];
2725
- case 2:
2726
- if (!(this.options.introspectionEndPointAuthMethod === 'client_secret_basic')) return [3 /*break*/, 4];
2727
- return [4 /*yield*/, this._introspectTokenWithClientSecretBasic(token)];
2728
- case 3: return [2 /*return*/, _a.sent()];
2729
- case 4:
2730
- if (!(this.options.introspectionEndPointAuthMethod === 'none')) return [3 /*break*/, 6];
2731
- return [4 /*yield*/, this._introspectTokenWithNone(token)];
2732
- case 5: return [2 /*return*/, _a.sent()];
2733
- case 6: throw new Error('初始化 AuthenticationClient 时传入的 introspectionEndPointAuthMethod 参数可选值为 client_secret_base、client_secret_post、none,请检查参数');
2734
- }
2735
- });
2736
- });
2737
- };
2738
- AuthenticationClient.prototype.validateTicketV1 = function (ticket, service) {
2739
- return __awaiter(this, void 0, void 0, function () {
2740
- var api, result, _a, valid, username;
2741
- return __generator(this, function (_b) {
2742
- switch (_b.label) {
2743
- case 0:
2744
- api = this.baseClient.appHost + "/cas-idp/" + this.options.appId + "/validate";
2745
- return [4 /*yield*/, this.naiveHttpClient.request({
2746
- method: 'GET',
2747
- url: api,
2748
- params: {
2749
- service: service,
2750
- ticket: ticket
2751
- }
2752
- })];
2753
- case 1:
2754
- result = _b.sent();
2755
- _a = result.split('\n'), valid = _a[0], username = _a[1];
2756
- return [2 /*return*/, __assign(__assign({ valid: valid === 'yes' }, (username && { username: username })), (valid !== 'yes' && { message: 'ticket 不合法' }))];
2757
- }
2758
- });
2759
- });
2760
- };
2761
- /**
2762
- * 判断 "我" 是否有某个角色
2763
- * @param roleCode 角色 Code
2764
- * @param namespace 权限分组 ID
2765
- */
2766
- AuthenticationClient.prototype.hasRole = function (roleCode, namespace) {
2767
- return __awaiter(this, void 0, void 0, function () {
2768
- var user, roleList, hasRole;
2769
- return __generator(this, function (_a) {
2770
- switch (_a.label) {
2771
- case 0: return [4 /*yield*/, graphqlapi_1.getUserRoles(this.graphqlClient, this.tokenProvider, {
2772
- id: this.checkLoggedIn(),
2773
- namespace: namespace
2774
- })];
2775
- case 1:
2776
- user = (_a.sent()).user;
2777
- if (!user) {
2778
- return [2 /*return*/, false];
2779
- }
2780
- roleList = user.roles;
2781
- if (roleList.totalCount < 1) {
2782
- return [2 /*return*/, false];
2783
- }
2784
- hasRole = false;
2785
- roleList.list.forEach(function (item) {
2786
- if (item.code === roleCode) {
2787
- hasRole = true;
2788
- }
2789
- });
2790
- return [2 /*return*/, hasRole];
2791
- }
2792
- });
2793
- });
2794
- };
2795
- /**
2796
- * @description 获取当前用户能够访问的应用
2797
- */
2798
- AuthenticationClient.prototype.listApplications = function (params) {
2799
- return __awaiter(this, void 0, void 0, function () {
2800
- var _a, _b, page, _c, limit, data;
2801
- return __generator(this, function (_d) {
2802
- switch (_d.label) {
2803
- case 0:
2804
- _a = params || {}, _b = _a.page, page = _b === void 0 ? 1 : _b, _c = _a.limit, limit = _c === void 0 ? 10 : _c;
2805
- return [4 /*yield*/, this.httpClient.request({
2806
- url: this.baseClient.appHost + "/api/v2/users/me/applications/allowed?page=" + page + "&limit=" + limit,
2807
- method: 'GET'
2808
- })];
2809
- case 1:
2810
- data = _d.sent();
2811
- return [2 /*return*/, data];
2812
- }
2813
- });
2814
- });
2815
- };
2816
- /**
2817
- * @description 检验 idToken 或 accessToken
2818
- */
2819
- AuthenticationClient.prototype.validateToken = function (options) {
2820
- return __awaiter(this, void 0, void 0, function () {
2821
- var data, data;
2822
- return __generator(this, function (_a) {
2823
- switch (_a.label) {
2824
- case 0:
2825
- if (!options) {
2826
- throw new Error('请在传入的参数对象中包含 accessToken 或 idToken 字段');
2827
- }
2828
- if (options.accessToken && options.idToken) {
2829
- throw new Error('accessToken 和 idToken 只能传入一个,不能同时传入');
2830
- }
2831
- if (!options.idToken) return [3 /*break*/, 2];
2832
- return [4 /*yield*/, this.naiveHttpClient.request({
2833
- url: this.baseClient.appHost + "/api/v2/oidc/validate_token",
2834
- method: 'GET',
2835
- params: {
2836
- id_token: options.idToken
2837
- }
2838
- })];
2839
- case 1:
2840
- data = _a.sent();
2841
- return [2 /*return*/, data];
2842
- case 2:
2843
- if (!options.accessToken) return [3 /*break*/, 4];
2844
- return [4 /*yield*/, this.naiveHttpClient.request({
2845
- url: this.baseClient.appHost + "/api/v2/oidc/validate_token",
2846
- method: 'GET',
2847
- params: {
2848
- access_token: options.accessToken
2849
- }
2850
- })];
2851
- case 3:
2852
- data = _a.sent();
2853
- return [2 /*return*/, data];
2854
- case 4: return [2 /*return*/];
2855
- }
2856
- });
2857
- });
2858
- };
2859
- /**
2860
- * @description 设置语言
2861
- */
2862
- AuthenticationClient.prototype.setLang = function (lang) {
2863
- this.options.lang = lang;
2864
- };
2865
- return AuthenticationClient;
2866
- }());
2867
- exports.AuthenticationClient = AuthenticationClient;
2868
- });
2869
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXV0aGVudGljYXRpb25DbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2F1dGhlbnRpY2F0aW9uL0F1dGhlbnRpY2F0aW9uQ2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUEsNkVBQTRFO0lBQzVFLDREQUFzQztJQUN0Qyx3REFBaUM7SUFFakMsNENBK0J1QjtJQUN2Qix5REFBd0Q7SUFDeEQsaUNBU2lCO0lBQ2pCLHFEQWFnQztJQUNoQywyRUFBMEU7SUFDMUUscUVBQW9FO0lBQ3BFLG1EQUFtRTtJQUNuRSxrQ0FTa0I7SUFDbEIsMERBQW1DO0lBRW5DLDJFQUEwRTtJQUMxRSwrREFBOEQ7SUFFOUQsbUZBQWtGO0lBQ2xGLHVFQUFzRTtJQUd0RSxJQUFNLGVBQWUsR0FBZ0M7UUFDbkQsS0FBSyxFQUFFLFNBQVM7UUFDaEIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsUUFBUSxFQUFFLE1BQU07UUFDaEIsdUJBQXVCLEVBQUUsb0JBQW9CO1FBQzdDLCtCQUErQixFQUFFLG9CQUFvQjtRQUNyRCw0QkFBNEIsRUFBRSxvQkFBb0I7UUFDbEQsT0FBTyxFQUFFLEtBQUs7UUFDZCxPQUFPLEVBQUUsVUFBQyxJQUFZLEVBQUUsT0FBZSxFQUFFLElBQVM7WUFDaEQsTUFBTSxFQUFFLElBQUksTUFBQSxFQUFFLE9BQU8sU0FBQSxFQUFFLElBQUksTUFBQSxFQUFFLENBQUM7UUFDaEMsQ0FBQztRQUNELFdBQVcsRUFBRSxLQUFLO1FBQ2xCLGVBQWUsRUFBRSxlQUFPO1FBQ3hCLElBQUksRUFBRSx5QkFBeUI7UUFDL0IsT0FBTyxFQUFFO1lBQ1AsYUFBYSxFQUFFLHVCQUF1QjtZQUN0QyxRQUFRLEVBQUUsa0JBQWtCO1lBQzVCLGNBQWMsRUFBRSx3QkFBd0I7WUFDeEMsYUFBYSxFQUFFLHVCQUF1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