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