authing_ruby 1.1.0 → 1.1.5

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