You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
3.0 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. <script lang="ts">
  2. import type {CognitoUser} from "amazon-cognito-identity-js";
  3. import { forgotPassword, forgotPasswordSubmit, signIn } from "../clients/amplify";
  4. import authStore from "../stores/auth";
  5. import Modal from "../components/Modal.svelte";
  6. let user: CognitoUser | null = null;
  7. let username = "";
  8. let password = "";
  9. let newPassword = "";
  10. let newPasswordRepeat = "";
  11. let resetCode = "";
  12. let settingNewPassword = false;
  13. let resettingPassword = false;
  14. let error = null;
  15. let done = false;
  16. function startPasswordReset() {
  17. forgotPassword(username).then(() => {
  18. settingNewPassword = true;
  19. resettingPassword = true;
  20. }).catch(err => {
  21. error = "Reset request failed: " + err.message;
  22. })
  23. }
  24. function login() {
  25. error = null;
  26. if (settingNewPassword) {
  27. if (newPasswordRepeat !== newPassword) {
  28. error = "New passwords do not match.";
  29. return;
  30. }
  31. if (resettingPassword) {
  32. forgotPasswordSubmit(username, resetCode, newPassword).then(() => {
  33. authStore.check();
  34. settingNewPassword = false;
  35. resettingPassword = false;
  36. }).catch(err => {
  37. error = "Reset submit failed: " + err.message;
  38. });
  39. } else {
  40. user.completeNewPasswordChallenge(newPassword, null, {
  41. onSuccess: () => {
  42. done = true;
  43. authStore.check();
  44. },
  45. onFailure: err => {
  46. error = err
  47. },
  48. })
  49. }
  50. } else {
  51. signIn(username, password).then(newUser => {
  52. if (!newUser) {
  53. error = "Incorrect username or password."
  54. return
  55. }
  56. if ((newUser as any).challengeName === "NEW_PASSWORD_REQUIRED") {
  57. error = "Password is expired, please update it."
  58. settingNewPassword = true;
  59. } else {
  60. authStore.check();
  61. done = true;
  62. }
  63. user = newUser;
  64. }).catch(err => {
  65. error = err.message
  66. });
  67. }
  68. }
  69. </script>
  70. <Modal show={!done} title="Login" error={error}>
  71. <form on:submit|preventDefault={login}>
  72. <label for="username">Username</label>
  73. <input name="username" type="text" bind:value={username} />
  74. {#if !resettingPassword}
  75. <label for="password">Password</label>
  76. <input name="password" type="password" bind:value={password} />
  77. {:else}
  78. <label for="resetCode">Code From Email</label>
  79. <input name="resetCode" type="text" bind:value={resetCode} />
  80. {/if}
  81. {#if settingNewPassword}
  82. <label for="newPassword">New Password</label>
  83. <input name="newPassword" type="password" bind:value={newPassword} />
  84. <label for="newPasswordRepeat">Repeat Password</label>
  85. <input name="newPasswordRepeat" type="password" bind:value={newPasswordRepeat} />
  86. {/if}
  87. <hr />
  88. <button type="submit">Login</button>
  89. {#if !settingNewPassword}
  90. <button disabled={username === ""} on:click|preventDefault={startPasswordReset}>Forgot Password</button>
  91. {/if}
  92. </form>
  93. </Modal>