Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

การสร้าง Envflow:การแชร์ตัวแปรสภาพแวดล้อมอย่างปลอดภัยด้วย Laravel และ Upstash Redis

เมื่อเร็ว ๆ นี้ ฉันได้รับแรงบันดาลใจจากโครงการ 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 ที่ช่วยให้คุณสามารถเข้ารหัสตัวแปรสภาพแวดล้อมของคุณได้ ในหน้านี้ คุณสามารถกำหนดจำนวนครั้งที่ตัวแปรสภาพแวดล้อมสามารถถอดรหัสได้และจะใช้งานได้นานเท่าใด

การสร้าง Envflow:การแชร์ตัวแปรสภาพแวดล้อมอย่างปลอดภัยด้วย Laravel และ Upstash Redis

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

หน้าความสำเร็จ

หน้าความสำเร็จเป็นหน้าธรรมดาที่แสดงสองวิธีในการแชร์ลิงก์ถอดรหัส:วิธีหนึ่งมีคีย์ถอดรหัส ในขณะที่อีกวิธีหนึ่งแยกคีย์ถอดรหัสออกจากลิงก์

การสร้าง Envflow:การแชร์ตัวแปรสภาพแวดล้อมอย่างปลอดภัยด้วย Laravel และ Upstash Redis

คุณสามารถค้นหาส่วนประกอบของหน้า Livewire ได้ที่ app/Livewire/SuccessPage.php และเทมเพลตตามบน resources/views/livewire/success-page.blade.php .

หน้าการถอดรหัส

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

การสร้าง Envflow:การแชร์ตัวแปรสภาพแวดล้อมอย่างปลอดภัยด้วย Laravel และ 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 วินาทีก็ตาม 🚀

การสร้าง Envflow:การแชร์ตัวแปรสภาพแวดล้อมอย่างปลอดภัยด้วย Laravel และ Upstash Redis

คุณสามารถเยี่ยมชมสภาพแวดล้อมการใช้งานจริงที่ปรับใช้ได้ที่ https://envflow.laravel.cloud

บทสรุป

ฉันหวังว่าคุณจะชอบโพสต์นี้ และมันช่วยให้คุณเข้าใจว่าฉันสร้าง Envflow ได้อย่างไร

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

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