Computer >> Máy Tính >  >> Phần mềm >> Thư

Cách tạo danh sách người đăng ký không cần máy chủ của riêng bạn với Go và AWS

Trong bài viết này, tôi sẽ chia sẻ cách tôi xây dựng quy trình đăng ký một cách hữu ích với xác nhận qua email không có ích gì. Bạn cũng có thể làm được.

Nếu bạn muốn xem nó hoạt động, bây giờ bạn có thể đăng ký vào danh sách email của tôi trên victoria.dev.

Bây giờ, tôi sẽ chỉ cho bạn cách tôi tạo ra nó.

Giới thiệu tính năng Đăng ký Đơn giản

Nếu quan tâm đến việc quản lý danh sách gửi thư hoặc bản tin của riêng mình, bạn có thể thiết lập Đăng ký đơn giản trên tài nguyên AWS của riêng mình để thu thập địa chỉ email.

API mã nguồn mở này được viết bằng Go và chạy trên AWS Lambda. Khách truy cập vào trang web của bạn có thể đăng ký danh sách của bạn, được lưu trữ trong bảng DynamoDB, sẵn sàng được truy vấn hoặc xuất khi bạn rảnh.

Khi ai đó đăng ký, họ sẽ nhận được email yêu cầu họ xác nhận đăng ký của mình. Điều này đôi khi được gọi là “chọn tham gia kép”, mặc dù tôi thích thuật ngữ “đã xác minh” hơn.

Đăng ký đơn giản hoạt động trên cơ sở hạ tầng không máy chủ và sử dụng AWS Lambda để xử lý các yêu cầu đăng ký, xác nhận và hủy đăng ký.

Bạn có thể tìm thấy dự án Đăng ký đơn giản, với mã nguồn mở hoàn toàn, trên GitHub. Tôi khuyến khích bạn kéo mã lên và làm theo!

Trong bài đăng này, tôi sẽ chia sẻ từng bước xây dựng, quy trình suy nghĩ đằng sau các chức năng chịu trách nhiệm đơn lẻ của API và các cân nhắc bảo mật cho một dự án AWS như dự án này.

Cách tạo luồng đăng ký đã xác minh

Quá trình đăng ký email không được xác minh rất đơn giản. Ai đó đặt email của họ vào một hộp trên trang web của bạn, sau đó email đó sẽ đi vào cơ sở dữ liệu của bạn.

Tuy nhiên, nếu tôi đã dạy bạn bất cứ điều gì về việc không tin tưởng vào thông tin đầu vào của người dùng, thì chính ý tưởng về quy trình đăng ký không được xác minh sẽ khiến bạn tăng cao. Spam có thể tuyệt vời khi được chiên trong một chiếc bánh mì sandwich, nhưng không có gì thú vị khi nó đang làm tăng hóa đơn AWS của bạn.

Mặc dù bạn có thể sử dụng một chiến lược như CAPTCHA hoặc câu đố để xác minh có phải là con người, nhưng những chiến lược này có thể tạo ra đủ ma sát để khiến người đăng ký tiềm năng của bạn từ chối.

Thay vào đó, email xác nhận có thể giúp đảm bảo cả tính chính xác của địa chỉ và khả năng gửi của người dùng.

Để xây dựng quy trình đăng ký với xác nhận email, hãy tạo các chức năng chịu trách nhiệm đơn lẻ đáp ứng từng bước hợp lý. Đó là:

  1. Chấp nhận địa chỉ email và ghi lại địa chỉ đó.
  2. Tạo mã thông báo được liên kết với địa chỉ email đó và ghi lại.
  3. Gửi một email xác nhận đến địa chỉ email đó cùng với mã thông báo.
  4. Chấp nhận yêu cầu xác minh có cả địa chỉ email và mã thông báo.

Để đạt được từng mục tiêu này, Đăng ký đơn giản sử dụng AWS SDK chính thức cho Go để tương tác với DynamoDB và SES.

Ở mỗi giai đoạn, hãy xem xét dữ liệu trông như thế nào và cách bạn lưu trữ dữ liệu đó. Điều này có thể giúp giải quyết các câu hỏi hóc búa như "Điều gì sẽ xảy ra nếu ai đó cố gắng đăng ký hai lần?" hoặc thậm chí mô hình hóa mối đe dọa chẳng hạn như, “Điều gì sẽ xảy ra nếu ai đó đăng ký bằng email mà họ không sở hữu?”

Sẳn sàng? Hãy chia nhỏ từng bước và xem điều kỳ diệu xảy ra như thế nào.

Đăng ký

Quá trình đăng ký bắt đầu với một biểu mẫu web khiêm tốn, giống như biểu mẫu trên trang chính của trang web của tôi. Một đầu vào biểu mẫu với các thuộc tính type="email" required giúp xác nhận, nhờ vào trình duyệt. Khi được gửi, biểu mẫu sẽ gửi yêu cầu GET tới điểm cuối đăng ký Simple Subscribe.

Đăng ký đơn giản nhận được yêu cầu GET tới điểm cuối này với một chuỗi truy vấn có chứa email của người đăng ký dự định. Sau đó, nó tạo ra một id giá trị và thêm cả hai emailid vào bảng DynamoDB của bạn.

Mục bảng bây giờ trông giống như:

email xác nhận id dấu thời gian
subscriber@example.com sai uuid-xxxxx 2020-11-01 00:27:39

confirm cột chứa boolean cho biết rằng mục là một yêu cầu đăng ký chưa được xác nhận. Để xác minh địa chỉ email trong cơ sở dữ liệu, bạn cần tìm đúng mục và thay đổi confirm thành true .

Khi bạn làm việc với dữ liệu của mình, hãy xem xét mục tiêu của từng thao tác và cách bạn có thể so sánh một yêu cầu đến với dữ liệu hiện có.

Ví dụ:nếu ai đó đưa ra yêu cầu đăng ký tiếp theo cho cùng một địa chỉ email, bạn sẽ xử lý nó như thế nào?

Bạn có thể nói, “Tạo một chi tiết đơn hàng mới với id mới . "Tuy nhiên, đây có thể không phải là chiến lược tốt nhất khi cơ sở dữ liệu ứng dụng không máy chủ của bạn được thanh toán theo khối lượng yêu cầu.

Vì tính năng Định giá DynamoDB phụ thuộc vào lượng dữ liệu bạn đọc và ghi vào bảng của mình, nên việc tránh xếp chồng lên dữ liệu dư thừa sẽ có lợi.

Với ý nghĩ đó, cần thận trọng khi xử lý các yêu cầu đăng ký cho cùng một email bằng cách thực hiện cập nhật thay vì thêm một dòng mới.

Đăng ký đơn giản thực sự sử dụng cùng một chức năng để thêm hoặc cập nhật một mục cơ sở dữ liệu. Điều này thường được gọi là “cập nhật hoặc chèn”.

Trong cơ sở dữ liệu như SQLite, điều này được thực hiện với cú pháp UPSERT. Trong trường hợp DynamoDB, bạn sử dụng thao tác cập nhật. Đối với Go SDK, cú pháp của nó là UpdateItem .

Khi nhận được yêu cầu đăng ký trùng lặp, mục cơ sở dữ liệu sẽ được khớp trên email chỉ có. Nếu mục hàng hiện tại được tìm thấy, id của nó và timestamp được ghi đè, giúp cập nhật bản ghi cơ sở dữ liệu hiện có và tránh làm ngập bảng của bạn với các yêu cầu trùng lặp.

Cách xác minh địa chỉ email

Sau khi gửi biểu mẫu, người đăng ký dự định sẽ nhận được email từ SES có chứa liên kết. Liên kết này được tạo bằng emailid từ bảng và có định dạng:

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

Trong thiết lập này, id là một UUID hoạt động như một mã thông báo bí mật. Nó cung cấp một số nhận dạng mà bạn có thể so khớp đủ phức tạp và khó đoán. Cách tiếp cận này ngăn mọi người đăng ký bằng các địa chỉ email mà họ không kiểm soát.

Truy cập liên kết sẽ gửi yêu cầu đến điểm cuối xác minh của bạn với emailid trong chuỗi truy vấn.

Lần này, điều quan trọng là phải so sánh cả email đến và id giá trị cho bản ghi cơ sở dữ liệu. Điều này xác minh rằng người nhận email xác nhận đang bắt đầu yêu cầu.

Điểm cuối xác minh đảm bảo rằng các giá trị này khớp với một mục trong cơ sở dữ liệu của bạn, sau đó thực hiện một thao tác cập nhật khác để đặt confirm thành true và cập nhật dấu thời gian. Mục bây giờ trông giống như:

email xác nhận id dấu thời gian
subscriber@example.com true uuid-xxxxx 2020-11-01 00:37:39

Cách truy vấn email

Bây giờ bạn có thể truy vấn bảng của mình để tạo danh sách email của bạn. Tùy thuộc vào giải pháp gửi email của bạn, bạn có thể thực hiện việc này theo cách thủ công, với Lambda khác hoặc thậm chí từ dòng lệnh.

Vì dữ liệu cho các đăng ký được yêu cầu (trong đó confirmfalse ) được lưu trữ trong bảng cùng với các đăng ký đã xác nhận, điều quan trọng là phải phân biệt dữ liệu này khi truy vấn địa chỉ email để gửi đến. Bạn sẽ muốn đảm bảo rằng mình chỉ trả lại các email có confirmtrue .

Tương tự như xác minh địa chỉ email, Đăng ký đơn giản sử dụng emailid làm đối số cho hàm xóa một mục khỏi bảng DynamoDB của bạn để hủy đăng ký địa chỉ email.

Để cho phép mọi người tự xóa mình khỏi danh sách của bạn, bạn cần cung cấp URL trong mỗi email bạn gửi bao gồm email của họ và id dưới dạng một chuỗi truy vấn tới điểm cuối hủy đăng ký. Nó sẽ trông giống như sau:

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

Khi liên kết được nhấp, chuỗi truy vấn được chuyển đến điểm cuối hủy đăng ký. Nếu email được cung cấp và id khớp với một mục cơ sở dữ liệu, mục đó sẽ bị xóa.

Việc chứng minh một phương pháp để người đăng ký tự động xóa họ khỏi danh sách của bạn mà không cần bất kỳ sự can thiệp nào của con người, là một phần của triết lý đạo đức và tôn trọng đối với việc xử lý dữ liệu được giao cho bạn.

Cách chăm sóc dữ liệu của bạn

Sau khi bạn quyết định chấp nhận dữ liệu của người khác, bạn có trách nhiệm quan tâm đến dữ liệu đó. Điều này có thể áp dụng cho mọi thứ bạn xây dựng. Đối với Đăng ký đơn giản, điều đó có nghĩa là duy trì tính bảo mật của cơ sở dữ liệu của bạn và cắt bỏ bảng của bạn theo định kỳ.

Để tránh giữ lại các địa chỉ email có confirmfalse quá một khung thời gian nhất định, bạn nên thiết lập chức năng dọn dẹp chạy theo lịch trình thường xuyên. Điều này có thể đạt được theo cách thủ công, với chức năng AWS Lambda hoặc sử dụng dòng lệnh.

Để dọn dẹp, hãy tìm các mục cơ sở dữ liệu tại confirmfalsetimestamp cũ hơn một thời điểm cụ thể. Tùy thuộc vào trường hợp sử dụng và khối lượng yêu cầu của bạn, tần suất bạn chọn để dọn dẹp sẽ khác nhau.

Cũng tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể muốn giữ các bản sao lưu dữ liệu của mình. Nếu bạn đặc biệt quan tâm đến tính toàn vẹn của dữ liệu, bạn có thể khám phá Sao lưu theo yêu cầu hoặc Khôi phục điểm trong thời gian cho DynamoDB.

Xây dựng cơ sở người đăng ký độc lập của bạn

Xây dựng danh sách người đăng ký của riêng bạn có thể là một nỗ lực đầy sức mạnh! Cho dù bạn định bắt đầu một bản tin, gửi thông báo về nội dung mới hay muốn tạo một cộng đồng xung quanh công việc của mình, thì không có gì mang tính cá nhân hoặc trực tiếp hơn là một email từ tôi cho bạn.

Tôi khuyến khích bạn bắt đầu xây dựng cơ sở người đăng ký của mình với Đăng ký đơn giản ngay hôm nay. Giống như hầu hết các công việc của tôi, nó là nguồn mở và miễn phí cho mục đích sử dụng cá nhân của bạn. Tìm hiểu kỹ mã tại kho lưu trữ GitHub hoặc tìm hiểu thêm tại SimpleSubscribe.org.

Nếu bạn thích bài viết này, tôi rất muốn biết. Tham gia cùng hàng nghìn người học cùng tôi trên victoria.dev. Truy cập hoặc đăng ký qua RSS để biết thêm các dự án tương tự như dự án này.