Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Yii

Xây dựng Startup của bạn: Mời Mọi Người qua URL

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Ajax for Meeting Times and Places
Building Your Startup: Increasing Security

Vietnamese (Tiếng Việt) translation by Thai An (you can also view the original English article)

Final product image
What You'll Be Creating

Hướng dẫn này là một phần của loạt bài viết Building Your Startup With PHP trên Envato Tuts+. Trong loạt bài này, tôi hướng dẫn bạn khởi phát một startup từ ý tưởng đến thực tế qua ứng dụng Meeting Planner của tôi làm ví dụ thực tế. Mỗi bước trên hành trình, tôi sẽ phát hành code của Meeting Planner như một mã nguồn mở mà bạn có thể học. Tôi cũng sẽ chỉ ra các vấn đề kinh doanh có liên quan đến khởi nghiệp khi chúng phát sinh.

Lên lịch cuộc họp nhóm qua URL ngắn gọn

Chào mừng bạn! Gần đây tôi đã trở lại từ nơi yêu thích nhất của tôi đã đề cập ở phần cuối của bài viết gần đây nhất. Sau khi hoàn thành multiple participant meetings, tôi đã nghỉ ngơi.

Building Your Startup Secure Shareable Invitation URL - My Favorite Place In the Woods

Hôm nay, tôi sẽ bổ sung khả năng mời người tham dự cuộc họp bằng cách chia sẻ một URL an toàn có tương tác với cuộc họp của bạn. Điều này đặc biệt hữu ích cho việc sắp xếp các cuộc họp nhóm. Ví dụ: nếu bạn muốn mời 30 người, đôi khi dễ dàng hơn để gửi email đến tất cả mọi người với một lời mời qua URL.

Nếu bạn chưa làm, hãy cố gắng sắp xếp cuộc họp nhóm của riêng bạn ngay hôm nay! Mời một vài người bạn để kombucha, kava, hoặc cà phê. Chia sẻ suy nghĩ và phản hồi của bạn về kinh nghiệm của mỗi người trong phần bình luận bên dưới. Tôi tham gia vào các cuộc thảo luận, nhưng bạn cũng có thể tìm tôi @reifman trên Twitter. Tôi luôn đón nhận ý tưởng tính năng mới cho Meeting Planner và các đề xuất cho bài viết trong tương lai.

Xin nhớ rằng, tất cả các code cho Meeting Planner được cung cấp nguồn mã nguồn mở và được viết trong framework Yii2 cho PHP. Nếu bạn muốn tìm hiểu thêm về Yii2, xem loạt bài viết song song của tôi Programming with Yii2.

Trước khi đào sâu vào tính năng này, tôi muốn đưa ra một số ví dụ về một số lỗi thông thường (hoặc những sơ sót) mà tôi đã gặp phải khi xây dựng dịch vụ. (Nếu bạn chỉ muốn đọc về các URL có thể chia sẻ và an toàn, vui lòng bỏ qua phần này.)

The Startup Bug Interlude

Khi ngày càng có nhiều người bắt đầu sử dụng Meeting Planner, thì lỗi xảy ra càng nhiều. Và, thông thường trong quá trình phát triển, tôi ghi chú chúng lại. Dưới đây là một vài lỗi gần đây, chỉ để cho bạn một ý niệm về cuộc sống của startup.

Có thể khó tập trung vào phát triển kinh doanh và tiếp thị, viết code cho các tính năng mới, và xác định và sửa lỗi. Startup độc lập gặp nhiều khó khăn khi các tính năng của trang web của bạn tăng lên.

Như tôi đã viết trước đó, tôi hiện đang sử dụng Asana cho lên lịch trình các tính năng - nhưng cũng để theo dõi các lỗi.

Lỗi của việc gán If

Tôi chắc chắn rằng nếu tôi là một nhà phát triển chuyên nghiệp hơn, được làm việc với các đồng nghiệp hoặc không tốn nhiều thời gian hơn để code cho Meeting Planner, tôi sẽ biết chính xác phần mở rộng nào của Atom Editor để tìm kiếm những lỗi này. Nếu bạn biết, xin vui lòng đăng nó lên ở các bình luận.

Rõ ràng, trong một tính năng quan trọng để kiểm tra xem người xem đã thực sự là một người tham dự cuộc họp, tôi đã sử dụng sự phân công để kiểm tra. Nói cách khác, tôi đã không dự định hỏi nếu chủ cuộc họp là người xem - tôi đã tạm thời thực hiện nó cho trường hợp này.

Bạn có nhớ, hai dấu bằng (==) dùng để so sánh, một dấu bằng (=) dùng để gán giá trị. Giống như các dấu chấm (.) để ghép nối chuỗi và ký hiệu dấu cộng (+) để tăng thêm giá trị, ngoại trừ JavaScript, nơi chúng ta vô cùng khó tìm lỗi (cũng là lý do tại sao Ajax trở thành địa ngục trong PHP).

Truy vấn database thất bại qua thời gian

Khi việc sử dụng Meeting Planner của tôi tăng lên, ngày ngày càng có nhiều cuộc họp trong các view (ở dạng tab) của tôi. Và sau đó tôi nhận thấy rằng đôi khi sẽ hiển thị các phần trùng lặp. Điều này rất khó phát hiện trước đó khi có dữ liệu ít hơn.

Những truy vấn cuộc về họp trên một tab cụ thể của tôi (ví dụ: lập kế hoạch cuộc họp, các cuộc họp đã được xác nhận, các cuộc họp trước đây, v.v.) không được tách biệt thành các mục nhập duy nhất:

Bổ sung thêm ->distinct() vào câu truy vấn để sửa lỗi này.

Phân trang Yii2 trên Grid Views trên Tabbed

Một lỗi tôi gặp phải khi có nhiều dữ liệu hơn là các liên kết phân trang Yii2 luôn đưa tôi trở lại thẻ tab đầu tiên.

Building Your Startup Secure Shareable Invitation URL - Pagination of Meetings

Tôi đã bổ sung một tham số truy vấn cho tab hiện tại mà actionIndex của MeetingController.php tìm kiếm:

Ngoài ra, tôi đã hướng dẫn các pagination params để nhập các thiết lập tab hiện tại. Khi người dùng nhấp vào liên kết trang khác, tab hiện tại đã được đưa vào.

Cuối cùng, tôi cũng làm cho /frontend/views/meeting/index.php nhận thức được điều này, thiết lập thẻ tab hoạt động từ tham số truy vấn:

Đó chỉ là một vài ví dụ điển hình về loại lỗi thường ngày mà tôi gặp phải khi đang xây dựng startup trong phạm vi của Meeting Planner.

Bây giờ, chúng ta hãy đi vào việc xây dựng lời mời thông qua các URL vắn tắt như đã đề cập.

Xây dựng các URL đường dẫn có thể chia sẻ an toàn

Suy nghĩ về bảo mật cho các URLs

Để tạo khó khăn cho việc phỏng đoán URL để đột nhập vào lời mời họp của một ai đó, tôi cần phải có một key khá độc đáo kết hợp với một code không thể đoán ra được.

Tôi đã quyết định sử dụng tên người dùng của một người như một mã khoá (key). Mỗi người dùng sẽ có một số lượng lớn các mã số cho các cuộc họp và gần nhiều không thể đoán được.

Ví dụ: URL cuộc họp có thể là https://meetingplanner.io/presidentellyary/X1Y2Z3A7C9.

Đối với mã số, tôi đã quyết định sử dụng tám chữ cái có phân biệt dạng chữ hoa hoặc thường. Nói cách khác, mỗi ký tự sẽ là a-z, A-Z, hoặc 0-9, về cơ bản có 62 khả năng cho mỗi ký tự.

Tổng con số các khả năng cho mỗi người dùng là 218,340,105,584,896 - tức hơn 218 nghìn tỷ. Oh, và bạn phải biết tên người dùng mục tiêu của mình để bắt đầu! Sẽ dễ dàng hơn nhiều khi hack tài khoản email của người tham gia.

Bổ sung mã bảo mật cho mỗi cuộc họp

Để thêm mã bảo mật cho tất cả các cuộc họp hiện đang có, tôi đã tạo một file migration, m160902_174350_extend_meeting_for_identifier.php:

Bạn sẽ nhận thấy rằng trong migration này, thực ra tôi đã mã để tạo các chuỗi ngẫu nhiên cho mỗi cuộc họp hiện tại, ví dụ Yii::$app->security->generateRandomString(8);.

Tôi không thường xuyên viết mã vào migration để cập nhật các khu vực hiện có của database. Trong trường hợp này, nó hoạt động suôn sẻ. Những lần khác, tôi đã sử dụng model /frontend/models/Fix.php.

Ngoài ra, trong Meeting::beforeSave(), tôi đã thêm code tự động để tạo identifier cho tất cả các cuộc họp trong tương lai:

Mở rộng Yii routing

Trong khi đơn giản nhất để bao gồm một tiền tố cho controller chẳng hạn như /m/username/identity-code, tôi muốn các liên kết đơn giản, không có tiền tố bổ sung. Điều này yêu cầu mở rộng Yii Routing.

Nếu tôi giữ nó trong model riêng của mình cho tiền tố và tên người dùng (username), tôi có thể đã sử dụng những gì tôi đã viết về trong Yii2 Sluggable BehaviorsBuilding Your Startup: Geolocation and Google Places.

Thay vào đó, tôi đã thêm '<username>/<identity:[A-Za-z0-9_-]{8}>' => 'meeting/identity', nó map bất kỳ tên người dùng nào với một chuỗi nhận dạng cho phương thức actionIdentity() của MeetingController.

Với điều này, tôi đã vướng vào một vài vấn đề. Tôi đã phải sắp xếp lại các quy tắc và đặt các route tĩnh cho bất kỳ hành động tám ký tự nào mà xuất hiện giống như một tên người dùng (thay vì một controller) và một phương thức (thay vì một khóa nhận dạng - identity key).

Ví dụ: https://meetingplanner.io/site/features được ánh xạ tới người dùng trên trang web có ID an toàn của cuộc họp của an toàn của 'features' thay vì tính năng mới tuyệt vời table của Meeting Planner.

Nhưng, khi tôi tự định hướng bản thân mình cho các vấn đề, mọi thứ đã ổn thoã.

Phương thức Identity của Controller Meeting

Tiếp theo, tôi đã xây dựng hàm actionIdentity() trong MeetingController:

Trước tiên, nó xác minh rằng tên người dùng và danh tính tương ứng với một người dùng đang tồn tại và một cuộc họp hiện tại. Nếu không, chúng tôi gửi họ sang authfailure.

Nếu người dùng đã đăng nhập, chúng tôi sẽ tự động thêm họ thành người tham gia vào trang này và chuyển hướng họ đến view của Meeting.

Nếu không, chúng tôi sẽ gửi họ đến hoạt động Join trong controller Participant để giải quyết việc đăng nhập hoặc đăng ký.

Người tham gia yêu cầu tham gia cuộc họp

Ví dụ: giả sử tôi nhận được lời mời qua email sau từ một người bạn:

https://meetingplanner.io/tomeMcFarline/JzRq1a42. Tôi sẽ được xem trang này:

Building Your Startup Secure Shareable Invitation URL - Participant Join Page from Invite URL

Nếu người dùng muốn đăng ký Meeting Planner qua mạng xã hội, chúng tôi sẽ có thể xác thực địa chỉ email của họ.

Vì vậy, tôi thiết lập Yii trả về URL (một trang mà người dùng được chuyển hướng đến sau khi đăng ký thành công hoặc đăng nhập) sẽ trả họ về trang xem cuộc họp sau khi xác thực.

Phần lớn, xác thực từ mạng xã hội, việc đăng nhập và (hoặc) đăng ký được quản lý bởi code tôi đã mô tả trong Building Your Startup: Simplifying Onramp With OAuth.

Nếu người tham gia là người mới, họ sẽ cung cấp tên và họ của họ và địa chỉ email. Chúng tôi sẽ bổ sung họ vào cuộc họp dưới dạng một người tham gia chưa được xác minh, giống như những gì chúng tôi làm khi người dùng mời ai đó bằng cách thêm địa chỉ email mới vào cuộc họp.

Bạn đang tự hỏi ngay bây giờ, này Jeff, dấu ... với ngày là gì? Rất đơn giản, phải không? Chúng tôi chỉ bổ sung một người dùng mới vào một cuộc họp.

Trong khi viết mã này, tôi nhận ra rằng tôi đang tạo ra một lỗ hổng cực lớn về sự riêng tư.

Ví dụ vui lỗ hổng bảo mật

Hãy nói rằng Tom McFarlin không có gì để làm một ngày nào và quyết định gây rối với tôi (và Chúa). Ông sẽ tạo ra một cuộc họp mới và, biết rằng Dalai Lama là một người sử dụng thường xuyên của Meeting Planner (vì tất cả các cuộc họp thiêng liêng của ông ta), McFarlin sẽ thêm ông ấy vào cuộc họp bằng email dalailama@gmail.com.

Sau đó, anh ta sẽ tìm thấy đường dẫn URL an toàn ưa thích của anh ta. Theo tôi?

Tiếp theo, McFarlin sẽ mở một trình duyệt khác và theo đường dẫn an toàn của ông ta và giả vờ là Dalai Lama, người vừa nhận được một lời mời khác qua email của Tom, tức là ông sẽ cố gắng tham gia cuộc họp của mình như thể ông là Dalai Lama. tức là Dalai, Lama, dalailama@gmail.com.

Ban đầu, tôi cho rằng không có khả năng ai đó đoán được URL an toàn, vì vậy nếu điều đó xảy ra, tôi chỉ muốn để một người đăng nhập theo cách này.

Tuy nhiên, điều này sẽ cho phép ngài McLarlin nguy hiểm có quyền truy cập vào tài khoản của Dalai Lama (một phần bởi vì tôi chưa xây dựng chế độ truy cập hạn chế cho người dùng truy xuất qua các URL để chỉ có thể xem một cuộc họp duy nhất cho đến khi họ đăng nhập).

Vâng, code ban đầu của tôi đã hoạt động theo cách này. Và sau đó tôi nhận được một cuộc gọi xuống từ trời và chỉ ra điều này.

Nếu McFarlin mời Sally và Sally chuyển tiếp URL an toàn cho Bill Gates thì sao? Bằng cách tự thêm Bill Gates vào cuộc họp đầu tiên, McFarlin có thể truy cập vào tất cả các cuộc họp của Gates với thủ thuật này.

Mã mới yêu cầu một người tham gia sử dụng URL an toàn đã được thêm vào cuộc họp một cách ngẫu nhiên vào cuộc họp để đăng nhập thủ công. Đây là code ... :

Tôi sẽ sửa lại lần nữa khi tôi tạo chế độ truy cập hạn chế cho cuộc họp.

Tôi có thể không nghĩ về điều này nếu trước đó tôi không biết McFarlin lém lĩnh như thế nào. Phew. Thêm một nữ hoàng nữa được cứu khỏi bị ngộ độc.

Building Your Startup Secure Shareable Invitation URL - The Devious Editorial God Tom McFarlin Or Not

Có lẽ trải qua kì nghỉ cuối tuần dài với thiên nhiên cũng đã cho tôi thấy gắn kết hơn với các thiên đàn.

Trong Pipeline là gì?

Building Your Startup Secure Shareable Invitation URL - Surfing Pipeline image
Domain công khai qua Google và Hawaii Picture of the Day

Tôi hy vọng bạn đã tận hưởng bài viết này trong việc tạo URL an toàn để mời mọi người tham gia cuộc họp. Tôi tưởng tượng nó có thể tái sử dụng rất nhiều cho các tình huống khác trong các dịch vụ của riêng bạn.

Bạn cũng có thể có thể nói tôi đang thưởng thức Meeting Planner có tiềm năng như đang có ở thời điểm này - hoặc tôi đã làm việc quá lâu.

Cuối cùng, việc xây dựng những URL bảo mật cho lời mời họp cũng mở rộng khả năng cung cấp cho người dùng một trang public (công khai) để lên lịch trình. Ví dụ: Tôi có thể chia sẻ URL public của Meeting Planner của tôi với bạn bè, và nói rằng, chỉ cần hẹn lịch với tôi tại https://meetingplanner.io/username.

Trong tương lai, tôi thậm chí có thể mở rộng Meeting Planner để đề xuất những tính năng trả phí cho các chuyên gia để đặt các cuộc hẹn tại trang public của Meeting Planner. Tuy nhiên, tôi có những ý tưởng thú vị khác. Lĩnh vực này được các công ty có định hướng kinh doanh khác đặt ra.

Riding the Wave Home

Nếu bạn vẫn chưa thực hiện, hãy lên kế hoạch cho cuộc họp đầu tiên của bạn với Meeting Planner. Thử chia sẻ liên kết của cuộc họp của bạn, và đừng để cho biên tập Tom McFarlin biết nhé.

Bạn cũng có thể tìm tôi qua @reifman. Tôi luôn cởi mở với những ý tưởng tính năng mới và những gợi ý về đề tài cho những bài hướng dẫn trong tương lai. Hoặc hãy thử helpdesk và mở một thẻ báo cáo lỗi hoặc yêu cầu tính năng.

Hướng dẫn về tài trợ từ cộng đồng cũng đang trong quá trình xuất bản, vậy hãy theo dõi trang WeFunder Meeting Planner của chúng tôi.

Hãy theo dõi những bài hướng dẫn tiếp theo bằng cách kiểm tra loạt bài Building Your Startup with PHP.

Related Links

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.