Computer >> คอมพิวเตอร์ >  >> ซอฟต์แวร์ >> จดหมาย

วิธีสร้างรายชื่อสมาชิกแบบไร้เซิร์ฟเวอร์ด้วย Go และ AWS

ในบทความนี้ ฉันจะแบ่งปันวิธีที่ฉันสร้างโฟลว์การลงชื่อสมัครรับข้อมูลด้วยความรักด้วยการยืนยันทางอีเมลที่ไม่มีปัญหา คุณก็ทำได้เช่นกัน

หากคุณต้องการเห็นการใช้งานจริง คุณสามารถสมัครรับรายชื่ออีเมลของฉันได้ที่ victoria.dev

ตอนนี้ฉันจะแสดงให้คุณเห็นว่าฉันสร้างมันอย่างไร

แนะนำการสมัครรับข้อมูลแบบง่าย

หากคุณสนใจที่จะจัดการรายชื่อส่งเมลหรือจดหมายข่าวของคุณเอง คุณสามารถตั้งค่า Simple Subscribe บนทรัพยากร AWS ของคุณเองเพื่อรวบรวมที่อยู่อีเมล

API แบบโอเพนซอร์สนี้เขียนในภาษา Go และทำงานบน AWS Lambda ผู้เยี่ยมชมไซต์ของคุณสามารถลงทะเบียนในรายการของคุณ ซึ่งจัดเก็บไว้ในตาราง DynamoDB พร้อมที่จะสอบถามหรือส่งออกตามที่คุณต้องการ

เมื่อมีคนลงชื่อสมัครใช้ พวกเขาจะได้รับอีเมลที่ขอให้ยืนยันการสมัครรับข้อมูล บางครั้งเรียกว่า "การเลือกใช้สองครั้ง" แม้ว่าฉันจะชอบคำว่า "ยืนยันแล้ว"

Simple Subscribe ทำงานบนโครงสร้างพื้นฐานแบบไร้เซิร์ฟเวอร์และใช้ AWS Lambda เพื่อจัดการการสมัครรับข้อมูล การยืนยัน และคำขอยกเลิกการสมัคร

คุณสามารถค้นหาโปรเจ็กต์ Simple Subscribe ด้วยโค้ดโอเพนซอร์ซแบบเต็มได้ที่ GitHub ฉันแนะนำให้คุณดึงรหัสและทำตาม!

ในโพสต์นี้ ฉันจะแชร์แต่ละขั้นตอนของบิลด์ กระบวนการคิดที่อยู่เบื้องหลังฟังก์ชันความรับผิดชอบเดียวของ API และข้อควรพิจารณาด้านความปลอดภัยสำหรับโปรเจ็กต์ AWS แบบนี้

วิธีสร้างขั้นตอนการสมัครสมาชิกที่ได้รับการยืนยัน

กระบวนการลงทะเบียนอีเมลที่ไม่ได้รับการยืนยันนั้นตรงไปตรงมา มีคนใส่อีเมลลงในกล่องบนเว็บไซต์ของคุณ จากนั้นอีเมลนั้นก็จะเข้าสู่ฐานข้อมูลของคุณ

อย่างไรก็ตาม หากฉันได้สอนคุณเกี่ยวกับการไม่เชื่อถือข้อมูลของผู้ใช้ แนวคิดของกระบวนการลงชื่อสมัครใช้ที่ไม่ผ่านการตรวจสอบควรเพิ่มการแฮ็กของคุณ สแปมอาจยอดเยี่ยมเมื่อนำไปผัดในแซนวิช แต่มันไม่สนุกเลยเมื่อบิล AWS ของคุณใกล้หมด

แม้ว่าคุณจะใช้กลยุทธ์อย่างเช่น CAPTCHA หรือปริศนาสำหรับการยืนยันตัวตนได้ แต่สิ่งเหล่านี้สามารถสร้างความขัดแย้งได้มากพอที่จะปฏิเสธผู้ที่อาจเป็นสมาชิกของคุณ

แต่อีเมลยืนยันสามารถช่วยให้แน่ใจว่าทั้งที่อยู่ถูกต้องและความรู้สึกของผู้ใช้

ในการสร้างโฟลว์การสมัครรับข้อมูลด้วยการยืนยันทางอีเมล ให้สร้างฟังก์ชันความรับผิดชอบเดียวที่ตรงตามแต่ละขั้นตอนเชิงตรรกะ ได้แก่:

  1. ยอมรับที่อยู่อีเมลและบันทึกไว้
  2. สร้างโทเค็นที่เชื่อมโยงกับที่อยู่อีเมลนั้นและบันทึกไว้
  3. ส่งอีเมลยืนยันไปยังที่อยู่อีเมลนั้นด้วยโทเค็น
  4. ยอมรับคำขอยืนยันที่มีทั้งที่อยู่อีเมลและโทเค็น

เพื่อให้บรรลุเป้าหมายแต่ละข้อ Simple Subscribe ใช้ AWS SDK for Go อย่างเป็นทางการเพื่อโต้ตอบกับ DynamoDB และ SES

ในแต่ละขั้นตอน ให้พิจารณาว่าข้อมูลมีลักษณะอย่างไรและจัดเก็บอย่างไร สิ่งนี้สามารถช่วยจัดการกับปริศนาเช่น “จะเกิดอะไรขึ้นถ้ามีคนพยายามสมัครรับข้อมูลสองครั้ง” หรือแม้แต่การสร้างแบบจำลองภัยคุกคาม เช่น “ถ้ามีคนสมัครรับข้อมูลด้วยอีเมลที่พวกเขาไม่ได้เป็นเจ้าของล่ะ”

พร้อม? มาทำลายแต่ละขั้นตอนและดูว่าเวทมนตร์เกิดขึ้นได้อย่างไร

กำลังติดตาม

กระบวนการสมัครรับข้อมูลเริ่มต้นด้วยเว็บฟอร์มที่เรียบง่าย เช่นเดียวกับที่อยู่ในหน้าหลักของเว็บไซต์ แบบฟอร์มอินพุตพร้อมแอตทริบิวต์ type="email" required ช่วยในการตรวจสอบด้วยเบราว์เซอร์ เมื่อส่งแล้ว แบบฟอร์มจะส่งคำขอ GET ไปยังจุดสิ้นสุดการสมัครรับข้อมูล Simple Subscribe

Simple Subscribe ได้รับคำขอ GET ไปยังปลายทางนี้ด้วยสตริงการสืบค้นที่มีอีเมลของสมาชิกที่ต้องการ จากนั้นจะสร้าง id และเพิ่มทั้ง email และ id ไปยังตาราง DynamoDB ของคุณ

รายการตารางตอนนี้ดูเหมือนว่า:

อีเมล ยืนยัน id ประทับเวลา
subscriber@example.com เท็จ uuid-xxxxx 2020-11-01 00:27:39

confirm คอลัมน์ซึ่งมีบูลีนแสดงว่ารายการนั้นเป็นคำขอสมัครรับข้อมูลที่ยังไม่ได้รับการยืนยัน หากต้องการยืนยันที่อยู่อีเมลในฐานข้อมูล คุณจะต้องค้นหารายการที่ถูกต้องและเปลี่ยน confirm ถึง true .

ขณะที่คุณทำงานกับข้อมูลของคุณ ให้พิจารณาเป้าหมายของการจัดการแต่ละครั้งและวิธีที่คุณอาจเปรียบเทียบคำขอที่เข้ามากับข้อมูลที่มีอยู่

ตัวอย่างเช่น ถ้ามีคนส่งคำขอสมัครรับข้อมูลสำหรับที่อยู่อีเมลเดียวกันในภายหลัง คุณจะจัดการกับมันอย่างไร

คุณอาจพูดว่า “สร้างรายการโฆษณาใหม่ด้วย id . ใหม่ " อย่างไรก็ตาม นี่อาจไม่ใช่กลยุทธ์ที่ดีที่สุดเมื่อฐานข้อมูลแอปพลิเคชันแบบไร้เซิร์ฟเวอร์ของคุณได้รับการชำระเงินตามปริมาณคำขอ

เนื่องจากการกำหนดราคา DynamoDB ขึ้นอยู่กับปริมาณข้อมูลที่คุณอ่านและเขียนลงในตารางของคุณ การหลีกเลี่ยงการซ้อนข้อมูลส่วนเกินจึงเป็นประโยชน์

ด้วยเหตุนี้ จึงควรระมัดระวังในการจัดการคำขอสมัครรับข้อมูลสำหรับอีเมลเดียวกันโดยดำเนินการอัปเดตแทนที่จะเพิ่มบรรทัดใหม่

Simple Subscribe ใช้ฟังก์ชันเดียวกันเพื่อเพิ่มหรืออัปเดตรายการฐานข้อมูล โดยทั่วไปจะเรียกว่า “อัปเดตหรือแทรก”

ในฐานข้อมูลเช่น SQLite สิ่งนี้ทำได้โดยใช้ไวยากรณ์ของ UPSERT ในกรณีของ DynamoDB คุณใช้การดำเนินการอัปเดต สำหรับ Go SDK ไวยากรณ์ของมันคือ UpdateItem .

เมื่อได้รับคำขอสมัครสมาชิกที่ซ้ำกัน รายการฐานข้อมูลจะถูกจับคู่ใน email เท่านั้น. หากพบรายการโฆษณาที่มีอยู่ id และ timestamp ถูกแทนที่ ซึ่งจะอัปเดตบันทึกฐานข้อมูลที่มีอยู่และหลีกเลี่ยงไม่ให้ตารางของคุณล้นด้วยคำขอที่ซ้ำกัน

วิธีการยืนยันที่อยู่อีเมล

หลังจากส่งแบบฟอร์มแล้ว สมาชิกที่ต้องการจะได้รับอีเมลจาก SES ที่มีลิงก์ ลิงค์นี้สร้างขึ้นโดยใช้ email และ id จากตารางและใช้รูปแบบ:

<BASE_URL><VERIFY_PATH>/?email=subscriber@example.com&id=uuid-xxxxx

ในการตั้งค่านี้ id เป็น UUID ที่ทำหน้าที่เป็นโทเค็นลับ มันมีตัวระบุที่คุณสามารถจับคู่ที่ซับซ้อนเพียงพอและคาดเดาได้ยาก วิธีการนี้จะป้องกันไม่ให้ผู้คนสมัครรับอีเมลด้วยที่อยู่อีเมลที่พวกเขาไม่ได้ควบคุม

การเยี่ยมชมลิงก์จะส่งคำขอไปยังปลายทางการยืนยันของคุณด้วย email และ id ในสตริงการสืบค้น

คราวนี้มาเปรียบเทียบทั้ง email . ที่เข้ามา และ id ค่าลงในบันทึกฐานข้อมูล นี่เป็นการยืนยันว่าผู้รับอีเมลยืนยันกำลังเริ่มต้นคำขอ

ปลายทางการตรวจสอบช่วยให้แน่ใจว่าค่าเหล่านี้ตรงกับรายการในฐานข้อมูลของคุณ จากนั้นดำเนินการอัปเดตอื่นเพื่อตั้งค่า confirm ถึง true และอัปเดตการประทับเวลา รายการตอนนี้ดูเหมือนว่า:

อีเมล ยืนยัน id ประทับเวลา
subscriber@example.com จริง uuid-xxxxx 2020-11-01 00:37:39

วิธีการสอบถามอีเมล

ตอนนี้คุณสามารถสอบถามตารางของคุณเพื่อสร้างรายชื่ออีเมลของคุณ คุณอาจดำเนินการด้วยตนเอง กับ Lambda อื่น หรือแม้กระทั่งจากบรรทัดคำสั่ง ทั้งนี้ขึ้นอยู่กับโซลูชันการส่งอีเมลของคุณ

เนื่องจากข้อมูลสำหรับการสมัครสมาชิกที่ร้องขอ (โดยที่ confirm คือ false ) ถูกจัดเก็บไว้ในตารางควบคู่ไปกับการสมัครรับข้อมูลที่ยืนยันแล้ว สิ่งสำคัญคือต้องแยกความแตกต่างของข้อมูลนี้เมื่อทำการสอบถามที่อยู่อีเมลที่จะส่งไป คุณจะต้องแน่ใจว่าคุณส่งคืนเฉพาะอีเมลที่ confirm คือ true .

คล้ายกับการยืนยันที่อยู่อีเมล Simple Subscribe ใช้ email และ id เป็นอาร์กิวเมนต์ของฟังก์ชันที่จะลบรายการออกจากตาราง DynamoDB ของคุณเพื่อยกเลิกการสมัครที่อยู่อีเมล

หากต้องการให้คนอื่นลบตัวเองออกจากรายชื่อ คุณจะต้องระบุ URL ในแต่ละอีเมลที่คุณส่งซึ่งมี email ของพวกเขา และ id เป็นสตริงการสืบค้นไปยังจุดสิ้นสุดการยกเลิกการสมัคร มันจะมีลักษณะดังนี้:

<BASE_URL><UNSUBSCRIBE_PATH>/?email=subscriber@example.com&id=uuid-xxxxx

เมื่อมีการคลิกลิงก์ สตริงการสืบค้นจะถูกส่งไปยังปลายทางการยกเลิกการสมัคร หากระบุ email และ id ตรงกับรายการฐานข้อมูล รายการนั้นจะถูกลบออก

การพิสูจน์วิธีการสำหรับสมาชิกของคุณเพื่อลบตัวเองออกจากรายการของคุณโดยอัตโนมัติ โดยไม่จำเป็นต้องมีการแทรกแซงของมนุษย์ เป็นส่วนหนึ่งของปรัชญาที่มีจริยธรรมและให้เกียรติในการจัดการข้อมูลที่ได้รับมอบหมายให้คุณ

วิธีดูแลข้อมูลของคุณ

เมื่อคุณตัดสินใจยอมรับข้อมูลของผู้อื่น จะกลายเป็นความรับผิดชอบของคุณในการดูแลข้อมูลนั้น สิ่งนี้ใช้ได้กับทุกสิ่งที่คุณสร้าง สำหรับ Simple Subscribe หมายถึงการรักษาความปลอดภัยของฐานข้อมูลของคุณ และตัดตารางของคุณเป็นระยะ

เพื่อหลีกเลี่ยงการรักษาที่อยู่อีเมลที่ confirm คือ false เมื่อพ้นกรอบเวลาที่กำหนดแล้ว จะเป็นความคิดที่ดีที่จะตั้งค่าฟังก์ชันการทำความสะอาดที่ทำงานตามกำหนดเวลาปกติ ซึ่งสามารถทำได้ด้วยตนเองด้วยฟังก์ชัน AWS Lambda หรือใช้บรรทัดคำสั่ง

หากต้องการล้างข้อมูล ให้ค้นหารายการฐานข้อมูลที่ confirm คือ false และ timestamp มีอายุมากกว่าช่วงเวลาใดเวลาหนึ่ง ขึ้นอยู่กับกรณีการใช้งานและปริมาณคำขอของคุณ ความถี่ที่คุณเลือกที่จะล้างข้อมูลจะแตกต่างกันไป

ทั้งนี้ขึ้นอยู่กับกรณีการใช้งานของคุณ คุณอาจต้องการสำรองข้อมูลของคุณ หากคุณกังวลเป็นพิเศษเกี่ยวกับความสมบูรณ์ของข้อมูล คุณสามารถสำรวจการสำรองข้อมูลแบบออนดีมานด์หรือการกู้คืนตามเวลาสำหรับ DynamoDB

สร้างฐานสมาชิกอิสระของคุณ

การสร้างรายชื่อสมาชิกของคุณเองอาจเป็นความพยายามอันทรงพลัง! ไม่ว่าคุณจะตั้งใจจะเริ่มต้นจดหมายข่าว ส่งการแจ้งเตือนสำหรับเนื้อหาใหม่ หรือต้องการสร้างชุมชนเกี่ยวกับงานของคุณ ไม่มีอะไรที่เป็นส่วนตัวหรือส่งตรงไปกว่าอีเมลจากฉันถึงคุณ

ฉันแนะนำให้คุณเริ่มสร้างฐานสมาชิกของคุณด้วย Simple Subscribe วันนี้ เช่นเดียวกับงานส่วนใหญ่ของฉัน มันเป็นโอเพ่นซอร์สและฟรีสำหรับการใช้งานส่วนตัวของคุณ เจาะลึกโค้ดที่ที่เก็บ GitHub หรือเรียนรู้เพิ่มเติมที่ SimpleSubscribe.org

หากคุณชอบโพสต์นี้ ฉันก็อยากจะรู้ เข้าร่วมกับผู้คนนับพันที่เรียนรู้ไปพร้อมกับฉันที่ victoria.dev เยี่ยมชมหรือสมัครผ่าน RSS สำหรับโครงการเพิ่มเติมเช่นนี้