authing_ruby 1.0.6

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