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

สร้าง Envflow: แชร์ Environment Variables อย่างปลอดภัยด้วย Laravel และ Upstash Redis

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

ผมอยากสร้างสิ่งคล้ายกันด้วย Upstash Redis จึงเลือกช่องทางเฉพาะ: การแชร์ environment variables ผมเดิมพันว่าคุณเคยต้องแชร์ secrets กับทีมเมตและสงสัยว่าจะสร้างระบบที่ทำได้อย่างปลอดภัยอย่างไร

แนะนำ Envflow โปรเจกต์ตัวอย่าง Laravel ที่ผมสร้าง ซึ่งใช้ Upstash Redis เป็นฐานข้อมูลหลักสำหรับจัดเก็บและแชร์ข้อมูลที่เข้ารหัส

ผมจะพาคุณผ่านกระบวนการสร้างโปรเจกต์นี้ ตั้งแต่ต้นจนจบ โดยข้ามรายละเอียดที่น่าเบื่อไป

Tech Stack

ก่อนอื่น ผมเลือกที่จะใช้ PHP และสร้างโปรเจกต์ด้วย TALL Stack ที่มีชื่อเสียง:

  • Tailwind CSS
  • Alpine JS
  • Laravel
  • Livewire
  • Upstash Redis

ฐานข้อมูล

ผมต้องการที่จัดเก็บข้อมูลที่เข้ารหัสซึ่งสามารถหมดอายุได้หลังจากเวลาที่กำหนด ขณะที่รวดเร็วและคุ้มค่า คุณคาดเดาได้แล้ว ผมเลือก Upstash Redis

Upstash Redis เป็นฐานข้อมูล Redis-compatible แบบ serverless จึงเหมาะอย่างยิ่งสำหรับกรณีการใช้งานนี้

Psst… เรามีคู่มือเริ่มต้นใช้งาน Upstash Redis และ Laravel!

ดูเพิ่มเติม

Routes / Endpoints

Envflow ทำงานบน 3 routes หลัก บวกกับ route เสริมที่อธิบายเกี่ยวกับโปรเจกต์ Routes เหล่านี้อยู่ในไฟล์ routes/web.php

หน้าแรก (Homepage)

Route หน้าแรกไม่ได้ทำหน้าที่เป็น landing page อย่างเดียว แต่ยังรวม Livewire Form ที่อนุญาตให้คุณเข้ารหัส environment variables ของคุณ ในหน้านี้คุณสามารถตั้งจำนวนครั้งที่ environment variables สามารถถอดรหัสได้ และระยะเวลาที่จะมี效力

สร้าง Envflow: แชร์ Environment Variables อย่างปลอดภัยด้วย Laravel และ Upstash Redis

คุณสามารถหา Livewire Page Component ได้ที่ app/Livewire/EncryptEnvPage.php และเทมเพลตที่ resources/views/livewire/encrypt-env-page.blade.php

หน้าสำเร็จ (Success Page)

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

สร้าง Envflow: แชร์ Environment Variables อย่างปลอดภัยด้วย Laravel และ Upstash Redis

คุณสามารถหา Livewire Page Component ได้ที่ app/Livewire/SuccessPage.php และเทมเพลตที่ resources/views/livewire/success-page.blade.php

หน้าถอดรหัส (Decryption Page)

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

สร้าง Envflow: แชร์ Environment Variables อย่างปลอดภัยด้วย Laravel และ Upstash Redis

คุณสามารถหา Livewire Page Component ได้ที่ app/Livewire/DecryptEnvPage.php และเทมเพลตที่ resources/views/livewire/decrypt-env-page.blade.php

Actions

สำหรับโปรเจกต์นี้ผมใช้รูปแบบ Action/Executor เพื่อจัดระเบียบส่วนประกอบหลักของ business logic ในแอปพลิเคชัน นี่ช่วยให้สามารถนำกลับมาใช้ใหม่ ทดสอบ และบำรุงรักษาได้ง่ายขึ้นเมื่อโค้ดโตขึ้น ยังช่วยให้แชร์พฤติกรรมดังกล่าวระหว่างส่วนต่างๆ ของแอปพลิเคชันได้ เช่น API ในอนาคต... ใครรู้...

คุณสามารถหา Actions ได้ที่ app/Actions แต่ผมอยากเน้น Encrypt และ Decrypt Actions เนื่องจากเป็นส่วนประกอบหลักที่จัดการการเข้ารหัสและถอดรหัส environment variables

การเข้ารหัส (Encryption)

ผมโชคดีที่ Laravel มี Encryption helper ในตัว แต่ผมต้องการอะไรที่แตกต่างออกไปเล็กน้อย เนื่องจากอยากให้มีคีย์เข้ารหัสที่กำหนดเองซึ่งสร้างขึ้นในขณะรันไทม์

หลังจากขุดค้น พบวิธีการ! เราสามารถใช้ class Illuminate\Encryption\Encrypter ที่อยู่เบื้องหลังของ Laravel ได้

use Illuminate\Encryption\Encrypter; $encrypter = new Encrypter( 'custom-encryption-key', // นี่คือสิ่งที่เราต้องการสร้าง config('app.cipher'), // เราจะใช้ cipher เริ่มต้นของ Laravel ); // โย่ว! เราสามารถเข้ารหัสค่าของเราได้แล้ว $encryptedValue = $encrypter->encryptString($value);

โอเค... การเข้ารหัสทำงานได้แล้ว หากคุณตรวจสอบไฟล์ที่ผมแชร์ไป คุณอาจสังเกตเห็นว่าโค้ดนี้อยู่ใน Encrypt และ Decrypt Actions

การจัดเก็บ (Storage)

เราได้ครอบคลุมแล้วว่าวิธีใช้ Actions และ class Encrypter ของ Laravel เข้ารหัสและถอดรหัสค่า แต่ยังไม่ได้ครอบคลุมวิธีจัดเก็บใน Upstash Redis

โค้ดส่วนนี้อยู่ใน Action StoreEnvFile

ผมอยากเน้นจุดสำคัญบางจุดจากไฟล์นั้น โค้ดต่อไปนี้:

// ... RedisFacade::pipeline(function (Redis $pipe) use (...) { $options = ['EX' => $ttl]; // ที่นี่คือการตั้งค่าเวลาหมดอายุ $pipe->set("envfile:$id", $encrypted->value, $options); $pipe->set("envfile:$id:shareLimit", $shareLimit, $options); }); // ...

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

การปรับใช้ (Deployment)

สำหรับการปรับใช้ ผมใช้ Laravel Cloud ที่เพิ่งเปิดตัว

การปรับใช้ไปที่ Laravel Cloud ง่ายมาก ใช้เวลาน้อยกว่า 1 นาทีในการไปจาก repository สู่แอปที่ปรับใช้สมบูรณ์พร้อม Redis instance ที่ผูกมาด้วยและโดเมนที่จัดเตรียมไว้ แม้ตอนนี้ การปรับใช้ก็ใช้เวลาน้อยกว่า 30 วินาที 🚀

สร้าง Envflow: แชร์ Environment Variables อย่างปลอดภัยด้วย Laravel และ Upstash Redis

คุณสามารถเยี่ยมชมสภาพแวดล้อม production ที่ https://envflow.laravel.cloud

สรุป

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

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

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