เมื่อเร็ว ๆ นี้ ฉันได้รับแรงบันดาลใจจากโครงการ Pyre.It ของ Nuno Maduro ซึ่งเป็นเว็บแอปที่ให้คุณส่งข้อความลับที่มีอายุสั้นถึงใครก็ได้ที่คุณต้องการ ข้อความเหล่านี้ได้รับการเข้ารหัสเมื่อไม่ได้ใช้งาน และมีเพียงคุณหรือบุคคลที่คุณแชร์ลิงก์ถอดรหัสด้วยเท่านั้นที่สามารถอ่านได้
ฉันต้องการสร้างสิ่งที่คล้ายกับ Upstash Redis ดังนั้นฉันจึงเลือกกลุ่มเฉพาะ:การแชร์ตัวแปรสภาพแวดล้อม ฉันพนันได้เลยว่าเมื่อถึงจุดหนึ่ง คุณจะต้องแบ่งปันความลับกับเพื่อนร่วมทีมและสงสัยว่าจะสร้างระบบที่ช่วยให้คุณทำอย่างปลอดภัยได้อย่างไร
ขอแนะนำ Envflow ซึ่งเป็นโปรเจ็กต์ตัวอย่าง Laravel ที่ฉันสร้างขึ้นซึ่งใช้ Upstash Redis เป็นฐานข้อมูลหลักสำหรับการจัดเก็บและแบ่งปันข้อมูลที่เข้ารหัส
ฉันจะแนะนำคุณตลอดขั้นตอนการสร้างโปรเจ็กต์นี้ ตั้งแต่ต้นจนจบโดยข้ามรายละเอียดที่น่าเบื่อไป
กองซ้อน
อันดับแรก ฉันเลือกที่จะยอมรับ PHP และสร้างโปรเจ็กต์โดยใช้สแต็ก TALL อันโด่งดัง:
- Tailwind CSS
- อัลไพน์ JS
- ลาราเวล
- ไลฟ์ไวร์
- สุดยอด Redis
ฐานข้อมูล
ฉันต้องการสถานที่สำหรับจัดเก็บข้อมูลที่เข้ารหัสซึ่งอาจหมดอายุหลังจากผ่านไประยะเวลาหนึ่งโดยยังคงความรวดเร็วและคุ้มค่า ตามที่คุณอาจเดาได้ ฉันเลือก Upstash Redis
Upstash Redis เป็นฐานข้อมูลแบบไร้เซิร์ฟเวอร์ที่เข้ากันได้กับ Redis ดังนั้นจึงเหมาะอย่างยิ่งสำหรับกรณีการใช้งานนี้
ปล. เรามีคู่มือเริ่มต้นใช้งานสำหรับ Upstash Redis และ Laravel!
ค้นหาข้อมูลเพิ่มเติม
เส้นทาง / จุดสิ้นสุด
Envflow ทำงานบนสามเส้นทางหลัก พร้อมด้วยเส้นทางเสริมที่อธิบายว่าโครงการเกี่ยวกับอะไร เส้นทางเหล่านี้สามารถพบได้ใน routes/web.php ไฟล์.
หน้าแรก
เส้นทางหน้าแรกไม่เพียงแต่ทำหน้าที่เป็นแลนดิ้งเพจสำหรับโครงการเท่านั้น แต่ยังรวมถึงแบบฟอร์ม Livewire ที่ช่วยให้คุณสามารถเข้ารหัสตัวแปรสภาพแวดล้อมของคุณได้ ในหน้านี้ คุณสามารถกำหนดจำนวนครั้งที่ตัวแปรสภาพแวดล้อมสามารถถอดรหัสได้และจะใช้งานได้นานเท่าใด

คุณจะพบส่วนประกอบของหน้า Livewire ได้ที่ app/Livewire/EncryptEnvPage.php และตามเทมเพลตใน resources/views/livewire/encrypt-env-page.blade.php .
หน้าความสำเร็จ
หน้าความสำเร็จเป็นหน้าธรรมดาที่แสดงสองวิธีในการแชร์ลิงก์ถอดรหัส:วิธีหนึ่งมีคีย์ถอดรหัส ในขณะที่อีกวิธีหนึ่งแยกคีย์ถอดรหัสออกจากลิงก์

คุณสามารถค้นหาส่วนประกอบของหน้า Livewire ได้ที่ app/Livewire/SuccessPage.php และเทมเพลตตามบน resources/views/livewire/success-page.blade.php .
หน้าการถอดรหัส
หน้านี้เป็นที่ที่ความอัศจรรย์ของการถอดรหัสเกิดขึ้น จำไว้ว่าเราไม่ได้จัดเก็บคีย์การเข้ารหัสไว้ในฐานข้อมูล Upstash Redis ของเรา เราจัดเก็บเฉพาะค่าที่เข้ารหัสซึ่งเป็นกลุ่มข้อมูลที่ไร้สาระเท่านั้น งานหลักของหน้าการถอดรหัสคือการใช้คีย์ถอดรหัสและพยายามถอดรหัสตัวแปรสภาพแวดล้อม

คุณจะพบส่วนประกอบของหน้า Livewire ได้ที่ app/Livewire/DecryptEnvPage.php และตามเทมเพลตใน resources/views/livewire/decrypt-env-page.blade.php .
การกระทำ
สำหรับโปรเจ็กต์นี้ ฉันได้ใช้รูปแบบ Action/Executor เพื่อจัดระเบียบส่วนประกอบหลักของตรรกะทางธุรกิจในแอปพลิเคชันของฉัน ซึ่งทำให้ฉันสามารถนำกลับมาใช้ใหม่ได้ในอนาคต ความสามารถในการทดสอบ และการบำรุงรักษาเมื่อโค้ดเติบโตขึ้น มันยังทำให้ฉันสามารถแบ่งปันพฤติกรรมดังกล่าวระหว่างส่วนต่างๆ ของแอปพลิเคชันของฉัน สมมติว่า API ในอนาคต... ใครจะรู้...
คุณสามารถค้นหาการดำเนินการได้ใน app/Actions แต่ฉันต้องการให้คุณเข้ารหัสและถอดรหัสเนื่องจากเป็นองค์ประกอบหลักที่จัดการการเข้ารหัสและถอดรหัสตัวแปรสภาพแวดล้อม
การเข้ารหัส
ฉันค่อนข้างโชคดีที่ Laravel มีตัวช่วยการเข้ารหัสในตัว แต่ฉันต้องการบางสิ่งที่แตกต่างออกไปเล็กน้อยเนื่องจากฉันต้องการมอบคีย์การเข้ารหัสแบบกำหนดเองที่สร้างขึ้นขณะรันไทม์
หลังจากขุดมาสักพักก็พบวิธี! เราสามารถใช้คลาสพื้นฐานของ Laravel Illuminate\Encryption\Encrypter .
use Illuminate\Encryption\Encrypter;
$encrypter = new Encrypter(
'custom-encryption-key', // this is the one we would want to generate
config('app.cipher'), // we'll use Laravel default cipher
);
// Hooray! We can now encrypt our value
$encryptedValue = $encrypter->encryptString($value); โอเค... ดังนั้นเราจึงเข้ารหัสได้ หากคุณตรวจสอบไฟล์ที่ฉันแชร์ คุณอาจสังเกตเห็นว่ารหัสนี้สามารถพบได้ในการดำเนินการเข้ารหัสและถอดรหัส
ที่เก็บข้อมูล
เราได้กล่าวถึงวิธีที่เราใช้ Actions และ Encrypter ดั้งเดิมของ Laravel คลาสเพื่อเข้ารหัสและถอดรหัสค่าของเรา แต่เรายังไม่ได้กล่าวถึงวิธีการจัดเก็บค่าเหล่านั้นใน Upstash Redis
รหัสนั้นอยู่บน StoreEnvFile การดำเนินการ
ฉันต้องการเน้นบางสิ่งจากไฟล์นั้น ซึ่งเป็นโค้ดต่อไปนี้
// ...
RedisFacade::pipeline(function (Redis $pipe) use (...) {
$options = ['EX' => $ttl]; // here is where we set the expiration time
$pipe->set("envfile:$id", $encrypted->value, $options);
$pipe->set("envfile:$id:shareLimit", $shareLimit, $options);
});
// ... ในโค้ดด้านบน คุณจะเห็นมีการใช้ไปป์ไลน์ Redis เพื่อให้แน่ใจว่าคำสั่งทั้งหมดจะดำเนินการในธุรกรรมเดียว นี่เป็นสิ่งสำคัญเนื่องจากเราไม่ต้องการเก็บค่าที่เข้ารหัสหากคำสั่งที่ตั้งไว้ล้มเหลว
การปรับใช้
สำหรับการปรับใช้ ฉันได้ใช้ Laravel Cloud ที่เพิ่งเปิดตัว
การปรับใช้กับ Laravel Cloud เป็นเรื่องง่ายอย่างเหลือเชื่อ ฉันใช้เวลาไม่ถึงหนึ่งนาทีในการเปลี่ยนจากพื้นที่เก็บข้อมูลไปเป็นแอปที่ใช้งานเต็มรูปแบบพร้อมกับอินสแตนซ์ Redis ที่แนบและโดเมนที่จัดเตรียมไว้ แม้ว่าตอนนี้การปรับใช้จะใช้เวลาไม่ถึง 30 วินาทีก็ตาม 🚀

คุณสามารถเยี่ยมชมสภาพแวดล้อมการใช้งานจริงที่ปรับใช้ได้ที่ https://envflow.laravel.cloud
บทสรุป
ฉันหวังว่าคุณจะชอบโพสต์นี้ และมันช่วยให้คุณเข้าใจว่าฉันสร้าง Envflow ได้อย่างไร
ฉันคิดว่ามีแอปพลิเคชันจำนวนมากที่สามารถใช้ Upstash Redis เป็นฐานข้อมูลหลักได้ แม้ว่า Redis ที่นี่จะถูกใช้เป็นที่เก็บ KV แต่ก็สามารถทำได้มากกว่านั้น และฉันจะแน่ใจว่าฉันจะกล่าวถึงเรื่องนี้ในบทความในอนาคตด้วยโครงการอื่นที่ฉันจะดำเนินการ
ซอร์สโค้ดสำหรับโปรเจ็กต์นี้มีอยู่ใน GitHub โปรดตรวจสอบและมีส่วนร่วมหากคุณมีแนวคิดหรือข้อเสนอแนะ (หรือพบข้อบกพร่องใดๆ)