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

 

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

 

ក្បួន​កណ្តាល​ឬ middleware គ្រាន់​ជា​កន្លែង​សំរាប់​បំបែក​កូដ​អាថ៌កំបាំង​ជា​ទិន្នន័យ​អ្នក​ចុះ​ឈ្មោះ ចំណែក​ការផ្ទៀងផ្ទាត់​មើល​ថា​តើ​អ្នក​ចុះឈ្មោះ​ណាមួយ​មាន​ទិន្នន័យ​នៅ​ក្នុង​ browser ឬ​អត់ និង​ត្រូវ​បញ្ជូនទៅ​ទំព័រ​គ្រប់គ្រង​ឬ​អត់ គឺ​ត្រូវ​ធ្វើ​ឡើង​នៅ​ក្នុង​ទំព័រចូល​ក្នុង​ដែល​ជា​​ឯកសារ login.astro ។

 

// src/middleware.js

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
import jwt from "jsonwebtoken"

export function onRequest ({ locals, request, cookies }, next) {
    locals.prisma = prisma
    const token = cookies.get('access_token')
    
    if(!token){
        return next()
    }

    try{
        const userAuth = jwt.verify(token.value, import.meta.env.SECRET_KEY)
        if(userAuth.userRole === "Admin"){
            locals.userAdmin = userAuth.userRole
        }
        locals.userAuth = userAuth
    }catch(err){
        console.log(err.message)
    }

    return next()
}

 

<!--src/pages/login.astro-->
---
const result = ""
const { userAuth } = Astro.locals
if(userAuth){
    return Astro.redirect('/admin')
}
---

<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: https://khmerweb-dynamic-blog.netlify.app/login

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