Plugins › สมาชิกของเว็บ
เริ่มต้น
เนื้อหา
Plugins
การดูแลระบบ
สูตรสำเร็จ
สมาชิกของเว็บ
สิ่งที่จะได้เรียนรู้
วิธีให้คนล็อกอินบนหน้าเว็บแทนระบบจัดการ เช่น ลูกค้า สมาชิกรับข่าว หรือสมาชิกชมรม การสมัครพร้อมยืนยันอีเมล หน้าของเว็บเอง สำหรับลิงก์ในอีเมล และสิ่งที่สมาชิกเห็นได้
อ่านก่อนหน้านี้: ผู้ใช้และการยืนยันตัวตน และ การควบคุมสิทธิ์
ผู้ใช้ระบบจัดการและสมาชิกของเว็บใช้ collection users และการล็อกอินเดียวกัน แต่ทำได้ไม่เท่ากัน สมาชิกคือผู้ที่มี role
อยู่ใน auth.members.roles:
- เข้าระบบจัดการไม่ได้ ทั้งหน้าและ endpoint ของระบบจัดการปฏิเสธ
- สิทธิ์ที่ค่าเริ่มต้นเป็น "ผู้ที่ล็อกอิน" (
isLoggedInค่าเริ่มต้นของทุก collection) ไม่นับสมาชิก ให้สิทธิ์เฉพาะที่ต้องใช้ เช่น ด้วยisSignedIn - เห็นเฉพาะบัญชีตัวเองใน
usersและเปลี่ยน role ตัวเองไม่ได้
import { isSignedIn } from '@easy-cms/core'
export default defineConfig({
auth: {
roles: ['admin', 'editor', 'customer'],
members: {
roles: ['customer'],
signup: { role: 'customer' },
pages: { verifyEmail: '/account/verify', resetPassword: '/account/reset' },
},
},
collections: [
{
slug: 'wishlists',
access: {
read: ({ user }) => (user ? { owner: { equals: user.id } } : false),
create: isSignedIn,
},
fields: [/* … */],
},
],
})ร้านค้า ตั้งค่านี้ให้ลูกค้าเอง
การสมัคร
เมื่อตั้ง signup ผู้เยี่ยมชมสร้างบัญชีเองได้ด้วย role ที่กำหนด:
// token ของฟอร์ม ตอนแสดงฟอร์ม: ยืนยันว่าไม่ใช่บอตที่กรอกทันที
const { token } = await fetch('/api/cms/users/signup').then((r) => r.json())
await fetch('/api/cms/users/signup', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ email, password, name, token, website: '' }),
})
// 202 { verify: true }: ส่งลิงก์ยืนยันอีเมลแล้ว- บัญชีใหม่ล็อกอินไม่ได้จนกว่าจะยืนยันอีเมล (
signup.verifyEmailค่าเริ่มต้นtrue) คำตอบเหมือนกันไม่ว่าอีเมลนั้นมีบัญชี หรือไม่ จึงไม่มีใครรู้ว่าใครสมัครไว้ - ลิงก์ในอีเมลเปิด
pages.verifyEmailบนเว็บพร้อม?token=หน้านั้นส่ง token ไปที่POST /api/cms/users/verify-email({ token }) เพื่อยืนยันอีเมลและเข้าสู่ระบบ - ถ้าไม่เปิด
verifyEmailการสมัครจะเข้าสู่ระบบทันที (201พร้อม session)
การกันสแปมเหมือนของฟอร์ม: token (ส่งเร็วเกินไปหรือเกินหนึ่งวันจะถูกปฏิเสธ) ช่องซ่อนที่บอตชอบกรอก (website)
จำกัดการสมัครต่อ IP และ Cloudflare Turnstile เมื่อตั้ง signup.turnstile: { siteKey, secretKey } คำตอบของการขอ token
บอก turnstile ด้วย (site key หรือ null)
การสมัครต้องตั้งค่าอีเมล และใน production ต้องมี URL ของเว็บสำหรับลิงก์: admin.siteUrl แบบ URL เต็ม หรือ serverURL
ลิงก์ในอีเมล
ลิงก์ "ลืมรหัสผ่าน" ของสมาชิกเปิด pages.resetPassword บนเว็บ ซึ่งส่ง token และรหัสผ่านใหม่ไปที่
POST /api/cms/users/reset-password หน้าเหล่านี้เป็น path (บน admin.siteUrl หรือ serverURL) หรือ URL เต็มก็ได้ ถ้าไม่ตั้ง
ลิงก์จะเปิดหน้าของระบบจัดการ
emails.verifyEmail เปลี่ยนข้อความอีเมลยืนยันได้ เหมือน auth.emails
การล็อกอินบนหน้าเว็บ
สมาชิกล็อกอินแบบเดียวกับ admin: POST /api/cms/users/login ตั้ง session cookie (ส่ง x-csrf-token จาก
GET /api/cms/users/me มากับการเขียน) หรือใช้ token กับ Authorization: Bearer ผู้ใช้ของ session มี member: true ในโค้ดฝั่ง
server ใช้ cms.forRequest(request) เพื่อรู้ว่าเป็นใคร
เมื่อใช้ plugin multi-tenant สมาชิกไม่ได้สังกัด tenant: ใช้เว็บของ request (โดเมนหรือ header) บัญชีเดียวจึงใช้ได้ กับเว็บของทุก tenant
ขั้นต่อไป
- ร้านค้า: ลูกค้า ตะกร้า และคำสั่งซื้อ
- การควบคุมสิทธิ์: กฎสำหรับเอกสารของสมาชิกเอง