យន្តការ​ត្រួត​ពិនិត្យ​គឺ​ជា​ដំណើរការ​ត្រួត​ពិនិត្យ​មើល​ថា តើ​អ្នក​ចុះឈ្មោះ​ចូល​ទៅ​កាន់​ទំព័រ​គ្រប់គ្រង​ (dashboard) ពិត​ជា​ត្រូវ​បាន​ចុះ​បញ្ជីរ​​នៅ​ក្នុង​មូលដ្ឋាន​ទិន្នន័យ MongoDB ដែរ​ឬទេ​។ ការត្រួត​ពិនិត្យ​គឹ​ធ្វើឡើង​ដោយ​យក​ Email និង​ពាក្យ​សំងាត់​របស់​អ្នក​ចុះឈ្មោះ​​ទៅ​ផ្ទៀងផ្ទាត់មើល​នៅ​ក្នុងមូលដ្ឋាន​ទិន្នន័យ បើ​សិន​ពិត​ជា​មាន អ្នក​ចុះ​ឈ្មោះ​នឹង​ត្រូវ​អនុញ្ញាតិ​អោយ​ចូល​ទៅ​កាន់​ទំព័រ​គ្រប់គ្រង (dashboard) បើ​អត់មាន​ទេ អ្នក​នោះ​​នឹង​មិន​ត្រូវ​អនុញ្ញាតិ​អោយ​ចូល​ទៅ​ទំព័រ​គ្រប់គ្រង និង​ប្រាប់​ពីកំហុស​បណ្តាល​មក​ពី​ខុស​ Email ឬខុស​ពាក្យ​សំងាត់​។

 

យន្តការត្រួត​ពិនិត្យ​នេះ​ទាមទារ​អោយ​យើង​ប្រើប្រាស់​កញ្ចប់ JSON Web Token (JWT) មួយទៀត ក្នុងការរក្សា​ទុកនៅ​ក្នុង browser ​​នូវ​ ឈ្មោះ អត្តសញ្ញាណ និង តួនាទី​ របស់អ្នក​ដែល​ត្រូវ​បាន​ផ្ទៀងផ្ទាត់​ថា​មាន​ឈ្មោះ​នៅ​ក្នុង​មូលដ្ឋាន​ទិន្នន័យរួច​ហើយ​។ ឈ្មោះ អត្តសញ្ញាណ និង តួនាទី ទាំងនោះ​នឹង​ត្រូវ​កែអោយ​ទៅ​ជាកូដដែល​មនុស្ស​មិន​អាច​មើល​យល់​ឬ​កែប្រែ​បាន មាន​តែ​កំព្យូទ័រ​ដែល​ដឹង​ពី​ពាក្យ​សំងាត់​របស់​យើង​តែ​ប៉ុណ្ណោះ​ ដែល​អាច​បកប្រែ​កូដ​នោះ​អោយ​ទៅជា​អក្សរ​ដើម​វិញ​បាន​។ លើស​ពី​​នេះ​ទៀត កូដ​អាថ៌កំបាំង​នោះ​នឹង​ត្រូវ​ប្រើការលែងកើត​​នៅ​ក្នុង​រយៈ​ពេល​មួយ​ដែល​ត្រូវ​បាន​កំណត់​ដោយ​អ្នក​សរសេរ​កម្មវិធី​គេហទំព័រ​​។

 

ដូចនេះ​យើង​ចាំបាច់​ត្រូវ​តំលើង​កញ្ចប់ JSON Web Token (JWT) នៅ​ក្នុង​កម្មវិធី​គេហទំព័រ​របស់​យើង​ដោយ​សរសេរ​នៅ​លើ​បង្អួច Terminal ថា​៖

 

npm install jsonwebtoken

 

យើង​អាច​ប្រើប្រាស់​ក្បួន​ចុង​ផ្លូវ​ឬ API Endpoint ណាមួយ​ក្នុង​ការទទួល​យក​ Email និង​ពាក្យ​សំងាត់​របស់​អ្នក​ចុះ​ឈ្មោះ ទៅ​ផ្ទៀងផ្ទាត់​មើល​ជាមួយ​មូលដ្ឋាន​ទិន្នន័យ MongoDB ។ ដោយ​​ហេតុ​ថា យើង​បាន​បង្កើតរួច​​មក​ហើយ​នូវ​ក្បួន​ចុង​ផ្លូវ​ឬ API Endpoint សំរាប់​ផ្លូវ /login ដូចនេះ​យើង​អាច​កែតំរូវ​ក្បួន​ចុង​ផ្លូវ​នេះ​សំរាប់​យន្តការ​ត្រួត​ពិនិត្យអ្នក​ចុះ​ឈ្មោះ​។ លើស​ពី​នេះ​ទៀត យើង​ត្រូវ​បង្កើត​ពាក្យ​សំងាត់​មួយ​នៅ​ក្នុង​ឯកសារ .env ទុក​សំរាប់​អោយ​កញ្ចប់ JWT យក​ទៅ​ប្រើ​ក្នុង​ការបង្កើត​កូដ​អាថ៌កំបាំង និង​បកប្រែ​កូដ​នោះ​មក​ជា​ភាសា​សាមញ្ញ​វិញ​នៅ​ពេល​ត្រូវ​ការ​។ ពាក្យ​សំងាត់​នោះ​អាច​ត្រូវ​តាង​ដោយ​អថេរ SECRET_KEY ។

 

// src/pages/api/login.js

import bcrypt from "bcryptjs"
import jwt from "jsonwebtoken"
const SECRET_KEY = import.meta.env.SECRET_KEY

export async function POST({cookies, redirect, request, locals}){
  const prisma = locals.prisma
  const body = await request.json()
  const user = await prisma.user.findUnique({ where: {email: body.email }})

  if(user){
    if(bcrypt.compareSync(body.password, user.password)){
      const data = {userId: user.id, userRole: user.role, userName: user.title}
      const token = jwt.sign(data, SECRET_KEY, {expiresIn: "12h"})
      cookies.set("access_token", token, { httpOnly: true, path: "/"})
      return redirect('/admin', 302)
    }else{
      const message = 'ពាក្យ​សំងាត់​មិន​ត្រឹមត្រូវ​ទេ'         
      return new Response(JSON.stringify(message))
    }
  }else{
    const message = 'Email មិន​ត្រឹមត្រូវទេ'
    return new Response(JSON.stringify(message))
  }
}

 

ទន្ទឹម​នឹង​នេះ យើង​ក៏​ត្រូវ​សរសេរ​កូដ​​បន្ថែម​មួយ​ចំនួន​ទៀត​នៅ​​ក្នុង​ទំព័រ login.astro ដើម្បី​អាច​ចំលង​យក​ Email និង​ពាក្យ​សំងាត់​របស់​​អ្នក​ចុះ​ឈ្មោះ និង​បញ្ជូន​វា​ទៅ​កាន់ក្បួន​ចុង​ផ្លូវ login.js សំរាប់​ការផ្ទៀង​ផ្ទាត់​។

 

<!--src/pages/login.astro-->
---
const result = ""
---

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width" />
        <meta name="generator" content={Astro.generator} />
        <title>​​​​​ទំព័រ​ចូល​ក្នុង</title>
        <link rel="icon" href="/images/siteLogo.png" />
        <link href="/fonts/setup.css" rel="stylesheet" />
        <script is:inline src="/scripts/jquery.js"></script>
    </head>
    <body class="text-sm leading-normal bg-gray-300">
        <section class="w-[300px] mx-auto mt-20 bg-white">
            <div class="text-center bg-teal-600 text-white font-display text-base py-1">
                ចុះ​ឈ្មោះ​ចូល​​​​​​​​ទំព័រគ្រប់គ្រង
            </div>
            <form id="login" class="p-5" action="/api/login" method="post">
                <input class="w-full border px-2 py-1 mb-2" value="guest@khmerweb.app"
                    type="email" name="email" required placeholder="Email"/>
                <input class="w-full border px-2 py-1 mb-2" value="password"
                    type="password" name="password" required placeholder="ពាក្យ​សំងាត់"/>
                <input class="w-full bg-gray-300 px-2 py-1" 
                    type="submit" value="បញ្ជូន​"/>
                <div id="info" class="text-center pt-1">{result}</div>
            </form>
        </section>
        <script>
            $('#login').on( "submit", function(event){
                event.preventDefault()
                const email = $('#login input[name="email"]').val()
                const password = $('#login input[name="password"]').val()

                const response = fetch('/api/login', {
                    method: 'POST',
                    headers: {'Content-Type': 'application/json'},
                    body: JSON.stringify({password, email}),
                    redirect: 'follow'
                }).then(response => {
                    if(response.redirected){  
                        window.location.replace(response.url)
                        return
                    }
                    return response.json()

                }).then(response => $('#login #info').html(response))
            })
        </script>
    </body>
</html>

 

យ៉ាងណាម៉ិញ សំរាប់​ប្រព័ន្ធ Netlify បើ​គ្មាន​តំណរភ្ជាប់​ទៅ​កាន់​មូលដ្ឋាន​ទិន្នន័យ MongoDB និង​ពាក្យ​សំងាត់​សំរាប់​កញ្ចប់ JWT ទេ កម្មវិធី​គេហទំព័រ​របស់​យើង​នឹង​មិន​អាច​ដំណើរ​ការ​​នៅ​លើ​ប្រព័ន្ធ​នេះ​បាន​ឡើយ ពីព្រោះ​អ្វី​ៗ​ដែល​ត្រូវ​បាន​កត់ត្រា​ទុក​នៅ​ក្នុង​ឯកសារ .env គឺសំរាប់​ប្រើប្រាស់​តែ​នៅ​ក្នុង​កំព្យូទ័រ​ផ្ទាល់​ខ្លួនតែ​ប៉ុណ្ណោះ វា​នឹង​មិន​ត្រូវបានចំលង​​ទៅ​ប្រព័ន្ធ GitHub ឬ​ប្រព័ន្ធ Netlify ឡើយ​។ តែ​មាន​វិធី​មួយ​ដែល​អាច​ដោះ​ស្រាយ​បញ្ហា​នេះ​បាន គឺ​យើង​ត្រូវ​ចំលង​យក​ពាក្យ​សំងាត់​និង​តំណរភ្ជាប់​ទៅ​កាន់​មូលដ្ឋាន​ទិន្នន័យ MongoDB ទៅ​ដាក់​នៅ​លើ​ប្រព័ន្ធ​ Netlify ដោយ​ខ្លួន​យើង​ផ្ទាល់​តែ​ម្តង​។

 

នៅ​លើ​ប្រព័ន្ធ Netlify យើង​អាច​ចំលង​យក​ពាក្យ​សំងាត់​និង​តំណរភ្ជាប់​ទៅ​មូលដ្ឋាន​ទិន្នន័យ​ ទៅ​ដាក់​នៅ​លើ​ប្រព័ន្ធ​នោះ​បាន​ដោយចុច​លើ​កម្មវិធី​គេហទំព័រ​ដែល​ត្រូវការ​ពាក្យ​សំងាត់​និង​តំណរភ្ជាប់​នោះ រួច​ចុច Site configuration និង​ចុច Environment variables ចុច Add a variable ចុច Import from a .env file និង​ចំលង​យក​អ្វី​ៗ​ទាំងអស់​នៅ​ក្នុង​ឯកសារ .env ទៅ​ដាក់​នៅ​កន្លែង Contents of .env file ចុង​ក្រោយ​បង្អស់​ចុច Import variables ៕

 

Netlify: https://khmerweb-dynamic-blog.netlify.app/login

GitHub: https://github.com/Sokhavuth/dynamic-blog