#30일 애플리케이션 쓰기: e-메일 확인 및 암호 분실


간단한 소개
#30DaysOfAppwrite은 개발자에게 Appwrite의 모든 기능, 기초 기능부터 클라우드 기능 등 고급 기능까지 이해할 수 있도록 한 달 동안의 활동입니다!이 밖에도 이러한 기술이 어떻게 실현되었는지 보여주기 위해 기능이 완비된 미디어 복제를 구축할 것이다
실제 세계의 응용 프로그램을 구축할 때 이러한 개념을 응용할 수 있다.우리는 또한 우리 개발자를 따르기 위해 감동적인 보상을 제공했다.

계정 확인
12일째에 오신 걸 환영합니다.👋. e-메일 확인 및 암호 복구는 모든 애플리케이션의 두 가지 핵심 기능입니다!Appwrite를 사용하여 이러한 두 가지 기능을 구현하는 방법을 학습합니다.

Note: This requires that you have SMTP setup on Appwrite. Check out where we teach you how to enable SMTP on Appwrite.


이메일 인증부터 시작하겠습니다.OAuth2가 로그인할 때 전자 우편 인증을 할 필요가 없습니다. 왜냐하면 이 예에서 전자 우편 주소는 로그인 공급자가 검증했기 때문입니다.

초기화 확인
계정을 확인하려면 사용자를 위한 세션을 만든 후 createVerification(url) 메서드를 호출해야 합니다.이 방법은 사용자의 전자 우편 주소에 인증 메시지를 보내서 그들이 이 주소의 유효한 소유자임을 확인합니다.제공된 URL은 응답용 프로그램으로 사용자를 리디렉션하고 사용자가 이미 제공한 userIdsecret 매개 변수를 검증하여 검증 과정을 완성할 수 있도록 해야 합니다.
let promise = sdk.account.createVerification('http://myappdomain/verifyEmail');

promise.then(function (response) {
    console.log(response); // Success
}, function (error) {
    console.log(error); // Failure
});
URL은 다음 단계에 필요한 두 개의 매개 변수를 가져와 검색 매개 변수로 URL에 추가합니다.예를 들어, 이 메서드에 http://myappdomain/verify을 전달하는 경우 이메일을 통해 사용자에게 제공되는 URL은 다음과 같습니다.http://localhost/verifyEmail?userId=XXXX&secret=YYYY
이메일 확인 완료
사용자가 계정 유효성 검사 프로세스를 초기화할 수 있으므로 이메일에 제공된 URL을 재정의하여 완료해야 합니다.
첫 번째 단계는 URL에서 제공하는 userIdsecret 값을 검색하는 것입니다.JavaScript에서는 다음과 같은 결과를 얻을 수 있습니다.
const urlParams = new URLSearchParams(window.location.search);
const userId = urlParams.get('userId');
const secret = urlParams.get('secret');
이 값을 사용하면 updateVerification(userId, secret) 을 사용하여 이메일 인증을 완료할 수 있습니다.
const sdk = new Appwrite();

sdk
    .setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
    .setProject('5df5acd0d48c2') // Your project ID
;

let promise = sdk.account.updateVerification(userId, secret);

promise.then(function (response) {
    console.log(response); // Success
}, function (error) {
    console.log(error); // Failure
});
현재 우리는 이미 한 사용자를 성공적으로 검증했다.

Be sure that this method is executed only on the URL provided in the email. In our example, this would be http://myappdomain/verifyEmail.



전체 예
좋습니다. 이제 프레젠테이션 프로그램에서 상술한 기능을 실현합시다.src/lib/Navigation.svelte에서 사용자의 검증 상태를 표시하는 단추를 만듭니다
...
{#if !$state.user.emailVerification}
    <button on:click={startEmailVerification}>Not Verified </button>
{:else}
    <p>Verified </p>
{/if}
....
<script> 부분에 startEmailVerification 함수를 추가합니다.
... 
import { api } from "../appwrite";

const startEmailVerification = async () => {
    try {
        const url = `${window.location.origin}/#/verifyEmail`
        await api.createVerification(url)
        alert("Verification Email sent")
    } catch (error) {
        alert(error.message)
    }
}
...

src/appwrite.js에서 다음 함수를 만듭니다
...
createVerification: async (url) => {
    await sdk.account.createVerification(url);
},
completeEmailVerification: async(userId, secret) => {
    await sdk.account.updateVerification(userId, secret);
},
...
우리는 검증 전자메일의 방향을 바꾸고 검증을 완성하기 위해 프로그램에 새 페이지를 만들어야 한다.
새 파일 생성 src/routes/VerifyEmail.svelte 및 다음 내용 추가
<script>
    import { api } from "../appwrite";
    let urlSearchParams = new URLSearchParams(window.location.search);
    let secret = urlSearchParams.get("secret");
    let userId = urlSearchParams.get("userId");
    console.log(userId,secret);
    const completeEmailVerification = async () => {
        await api.completeEmailVerification(userId, secret)
        window.location.href = "/"
    }
    completeEmailVerification()
</script> 
이 페이지의 라우트를 src/App.svelte에 생성하는 것을 잊지 마십시오.😊
import VerifyEmail from "./routes/VerifyEmail.svelte";

...
const routes = {
    "/": Index,
    "/login": Login,
    "/register": Register,
    "/verifyEmail": VerifyEmail,
    "*": NotFound,
};
...
잘했어!방금 사용자를 위해 Email Verification을 사용했습니다. 백엔드 코드를 한 줄 작성할 필요가 없습니다.이제 Password Recovery을 사용할 때가 되었다.

암호 복구
현재 사용자는 그들의 계정을 검증할 수 있고, 우리는 그들이 비밀번호를 잃어버린 상황에서 계정을 회복할 수 있도록 해야 한다.이 절차는 계정을 검증할 때 사용하는 절차와 매우 비슷하다.

암호 복구 초기화
첫 번째 단계는 URL에서 암호를 재설정하기 위해 임시 키가 있는 이메일을 createRecovery(email, url) 방법으로 사용자에게 보내는 것입니다.
let promise = sdk.account.createRecovery('[email protected]', 'http://myappdomain/resetPassword');

promise.then(function (response) {
    console.log(response); // Success
}, function (error) {
    console.log(error); // Failure
});
이 호출이 성공하면 사용자에게 이메일을 보내서 URL을 제공합니다. 이 URL의 secretuserid 값은 createRecovery(email, url)에 전달된 URL에 추가됩니다.

전체 복구 암호
복구 페이지에서 새 암호를 두 번 입력하라는 메시지가 표시되고 커밋할 때 updateRecovery(userId, secret, password, passwordAgain) 으로 전화하십시오.앞에서 설명한 것처럼 URL에서 userIdsecret 값을 가져옵니다.
const urlParams = new URLSearchParams(window.location.search);
const userId = urlParams.get('userId');
const secret = urlParams.get('secret');
이 값을 사용하면 updateRecovery(userId, secret, password, passwordAgain)을 사용하여 암호 복구를 완료할 수 있습니다.
const sdk = new Appwrite();

sdk
    .setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
    .setProject('5df5acd0d48c2') // Your project ID
;
let password; // Assign the new password choosen by the user
let passwordAgain;
let promise = sdk.account.updateRecovery(userId, secret, password, paswordAgain);

promise.then(function (response) {
    console.log(response); // Success
}, function (error) {
    console.log(error); // Failure
});
현재 우리는 이미 사용자의 비밀번호를 성공적으로 리셋했다.

전체 예
다행이다, 인코딩해야겠다!src/routes/Login.svelte에서 비밀번호를 복구할 수 있는 단추를 만듭니다
...

<button class="button" on:click|preventDefault={forgotPassword}>Forgot Password?</button>

....
<script> 부분에 forgotPassword 함수를 추가합니다.
... 
import { api } from "../appwrite";

const forgotPassword = async () => {
    const url = `${window.location.origin}/#/resetPassword`
    console.log(url);
    try {
        await api.forgotPassword(mail, url)
        alert("Recovery Email Sent")
    } catch (error) {
        alert(error.message);
    }
}
...

src/appwrite.js에서 다음 함수를 만듭니다
....

forgotPassword: async (email, url) => { 
    await sdk.account.createRecovery(email, url) 
},
completePasswordRecovery: async (userId, secret, pass, confirmPass) => { 
    await sdk.account.updateRecovery(userId, secret, pass, confirmPass) 
},

...
비밀번호로 전자메일을 복구할 수 있는 새 페이지를 프로그램에 만들어야 합니다.새 파일 src/routes/ResetPassword.svelte을 만들고 다음 코드를 추가합니다.
어찌할 바를 모르다.URL 매개 변수에서 userIdsecret을 가져오면 새 비밀번호를 입력하고 updateRecovery에 요청을 보내고 성공할 때 로그인 페이지로 다시 지정할 수 있습니다.
<script>
    import { api } from "../appwrite";
    let urlSearchParams = new URLSearchParams(window.location.search);
    let secret = urlSearchParams.get("secret");
    let userId = urlSearchParams.get("userId");
    let password = "",
        confirmPassword = "";
    const submit = async () => {
        try {
            await api.completePasswordRecovery(
                userId,
                secret,
                password,
                confirmPassword
            );
            window.location.href = "/#/login";
        } catch (error) {
            alert(error.message);
        }
    };
</script>

<div>
    <h1>Reset your password</h1>

    <form on:submit|preventDefault={submit}>
        <label for="password"><b>New Password</b></label>
        <input
            bind:value={password}
            type="password"
            placeholder="Enter New Password"
            name="password"
            required />

        <label for="confirmPassword"><b>Confirm Password</b></label>
        <input
            bind:value={confirmPassword}
            type="password"
            placeholder="Confirm Password"
            name="confirmPassword"
            required />

        <button class="button" type="submit">Reset Password</button>
    </form>
</div>

<style>
    div {
        margin-left: auto;
        margin-right: auto;
        width: 400px;
    }
    form {
        display: flex;
        flex-direction: column;
    }
</style>
이 페이지의 라우트를 src/App.svelte에 생성하는 것을 잊지 마십시오.😊
import ResetPassword from "./routes/ResetPassword.svelte";

...
const routes = {
    "/": Index,
    "/login": Login,
    "/register": Register,
    "/resetPassword": ResetPassword,
    "/verifyEmail": VerifyEmail,
    "*": NotFound,
};
...
경탄할 만한!만일 모든 것이 순조롭다면, 당신의 사용자는 지금 그들의 비밀번호를 리셋할 수 있습니다!!언제든지 this PR을 방문하여 이 기능을 구현하는 방법을 확인하실 수 있습니다.

크레디트
우리는 네가 이 문장을 좋아하길 바란다.너는 소셜 미디어에서 우리의 모든 댓글을 주목할 수 있다.전체 활동 일정은 here에서 확인할 수 있습니다.
  • Discord Server

  • Appwrite Homepage
  • Appwrite's Github
  • Appwrite, 외계인 또는 유니콘에 대해 더 알고 싶으시면 언제든지 연락 주세요.🦄. 내일 글 계속 봐주세요!그 전에👋

    좋은 웹페이지 즐겨찾기