Skip to content

Commit

Permalink
Set up Vault Management project with basic Firebase config
Browse files Browse the repository at this point in the history
  • Loading branch information
ilyasbozdemir committed Sep 7, 2024
1 parent 8d5eede commit 58fd9c3
Show file tree
Hide file tree
Showing 96 changed files with 6,317 additions and 2 deletions.
47 changes: 47 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Node.js bağımlılıkları (eğer bunları image içinde yeniden yükleyecekseniz)
node_modules
npm-debug.log
yarn-debug.log
yarn-error.log

# Local development environment files
.env
.env.*

# docs

docs/

# Logs
logs
*.log

# Test ve coverage dosyaları
coverage
*.lcov

# Dockerfile ve Docker-compose dosyaları hariç tüm gizli dosyalar
.*
!.dockerignore
!Dockerfile
!docker-compose*.yml

# Git metadata (repository'ye özel)
.git
.gitignore

# IDE ve editör klasörleri
.vscode
.idea

# Temp dosyaları
tmp
*.tmp

# Build klasörleri
build
dist

# Cache dosyaları
.cache
.parcel-cache
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json


# env files

.env.development
.env.production
.env.staging
.env.test

# Runtime data
pids
*.pid
Expand Down
23 changes: 23 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Base image
FROM node:20-slim

# Set working directory
WORKDIR /usr/src/app

# Copy package.json and package-lock.json
COPY package*.json ./

# Install dependencies (for production, adjust if needed)
RUN npm install --production

# Copy rest of the app
COPY . .

# Build the app (if necessary)
RUN npm run build

# Expose the port the app runs on (default for most Node.js apps)
EXPOSE 3000

# Start the app
CMD ["npm", "start"]
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.

Copyright [yyyy] [name of copyright owner]
Copyright [2024] [Ilyas Bozdemir]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand Down
295 changes: 294 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,294 @@
# vault-management

# Vault Management

**Vault Management** güvenli anahtar yönetimi, kullanıcı doğrulama ve çeşitli bulut hizmetlerini yönetme gibi işlemleri kolaylaştırmak için geliştirilmiş bir çözümdür. Proje, hem yönetim paneli hem de SDK desteği sunarak kullanıcıların güvenli bir şekilde hizmetleri yönetmesine ve izlenmesine olanak tanır. Firebase entegrasyonu ile güçlü kimlik doğrulama ve veritabanı yönetimi sağlanmaktadır.


**NOT:** JavaScript ile geliştirilen, ancak TypeScript'e geçiş sürecinde olan bir proje olup, hem sunucu tarafında hem de modül olarak hizmet verebilen bir çözüm sunmaktadır. Bu proje, kullanıcıların güvenli anahtar yönetimi, kimlik doğrulama ve bulut hizmetlerinin entegrasyonu gibi ihtiyaçlarını karşılamak üzere tasarlanmıştır. Yönetim paneli ve SDK desteğiyle, kullanıcıların hem kolay hem de güvenli bir şekilde hizmetleri yönetmesine olanak tanır. Firebase entegrasyonu sayesinde güçlü kimlik doğrulama, güvenli veri yönetimi ve gelişmiş yapılandırma seçenekleri sunulmaktadır.

Proje, özellikle:
- Hassas verilerin (API anahtarları, bağlantı bilgileri vb.) güvenli yönetimi,
- Firebase tabanlı kimlik doğrulama ve veri yönetimi,
- Yönetim paneli üzerinden kolay yapılandırma ve kontrol imkanı sunar.

---

## Firebase Entegrasyonu

Bu projede Firebase, kimlik doğrulama, veritabanı (Firestore) ve diğer servisler için temel yapı taşıdır. Firebase yapılandırmasını tamamlamak için aşağıdaki adımları izleyin.

### Firebase Proje Kurulumu ve Yapılandırması

1. **Firebase Console'a Giriş**:
- [Firebase Console](https://console.firebase.google.com/) adresine gidin ve Google hesabınızla giriş yapın.
- Yeni bir proje oluşturmak için "Add Project" butonuna tıklayın ve proje adı olarak `vault-management-panel` gibi bir isim belirleyin.

2. **Firebase Config Bilgilerini Alma**:
- Proje ayarlarına gidin ve web uygulaması ekleyin.
- Firebase size aşağıdaki gibi bir yapılandırma bilgisi verecek:
```javascript
const firebaseConfig = {
apiKey: "YOUR_FIREBASE_API_KEY",
authDomain: "YOUR_FIREBASE_AUTH_DOMAIN",
projectId: "YOUR_FIREBASE_PROJECT_ID",
storageBucket: "YOUR_FIREBASE_STORAGE_BUCKET",
messagingSenderId: "YOUR_FIREBASE_MESSAGING_SENDER_ID",
appId: "YOUR_FIREBASE_APP_ID",
measurementId: "YOUR_FIREBASE_MEASUREMENT_ID"
};
```

3. **.env.production Dosyasına Firebase Bilgilerini Ekleyin**:
Firebase'den aldığınız yapılandırma bilgilerini `.env.production` dosyasına ekleyin. Bu dosya, projedeki tüm Firebase yapılandırma bilgilerini içerir.
**Örnek .env.production Dosyası**:
```bash
FIREBASE_API_KEY=your-firebase-api-key
FIREBASE_AUTH_DOMAIN=your-firebase-auth-domain
FIREBASE_PROJECT_ID=your-firebase-project-id
FIREBASE_STORAGE_BUCKET=your-firebase-storage-bucket
FIREBASE_MESSAGING_SENDER_ID=your-firebase-messaging-sender-id
FIREBASE_APP_ID=your-firebase-app-id
FIREBASE_MEASUREMENT_ID=your-firebase-measurement-id
```
4. **Firebase Admin SDK için JSON Dosyasını İndirin**:
- Firebase Console'da **Project Settings** bölümünden **Service Accounts** sekmesine gidin.
- "Generate New Private Key" butonuna tıklayın ve JSON dosyasını indirin. Bu dosya Firebase Admin SDK ile kullanılacaktır.

5. **Firebase Admin SDK Yapılandırması**:
- İndirdiğiniz JSON dosyasındaki verileri kullanarak, **.env.production** dosyasına eklemelisiniz. Admin tarafında yapılacak işlemler için bu bilgiler gereklidir.
- **Örnek .env.production Yapılandırması**:
```bash
FIREBASE_ADMIN_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
YOUR_PRIVATE_KEY_HERE
-----END PRIVATE KEY-----"
FIREBASE_ADMIN_CLIENT_EMAIL=your-service-account-email
FIREBASE_ADMIN_PROJECT_ID=your-firebase-project-id
FIREBASE_ADMIN_PRIVATE_KEY_ID=your-private-key-id
FIREBASE_ADMIN_TOKEN_URI=your-token-uri
FIREBASE_ADMIN_AUTH_PROVIDER_CERT_URL=your-auth-provider-cert-url
FIREBASE_ADMIN_CLIENT_CERT_URL=your-client-cert-url
```

---

## Ortam Değişkenleri (.env) Yapılandırması

Firebase yapılandırmanızı tamamlamak için `.env.production` dosyasını oluşturun ve Firebase'den aldığınız yapılandırma bilgilerini bu dosyaya ekleyin. Aynı zamanda Firebase Admin SDK için gereken JSON dosyasındaki bilgileri de bu dosyaya ekleyin.
**Örnek .env.production Dosyası**:
```bash
# Firebase Client SDK Config
FIREBASE_API_KEY=your-firebase-api-key
FIREBASE_AUTH_DOMAIN=your-firebase-auth-domain
FIREBASE_PROJECT_ID=your-firebase-project-id
FIREBASE_STORAGE_BUCKET=your-firebase-storage-bucket
FIREBASE_MESSAGING_SENDER_ID=your-firebase-messaging-sender-id
FIREBASE_APP_ID=your-firebase-app-id
FIREBASE_MEASUREMENT_ID=your-firebase-measurement-id
# Firebase Admin SDK Config
FIREBASE_ADMIN_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
YOUR_PRIVATE_KEY_HERE
-----END PRIVATE KEY-----"
FIREBASE_ADMIN_CLIENT_EMAIL=your-service-account-email
FIREBASE_ADMIN_PROJECT_ID=your-firebase-project-id
FIREBASE_ADMIN_PRIVATE_KEY_ID=your-private-key-id
FIREBASE_ADMIN_TOKEN_URI=your-token-uri
FIREBASE_ADMIN_AUTH_PROVIDER_CERT_URL=your-auth-provider-cert-url
FIREBASE_ADMIN_CLIENT_CERT_URL=your-client-cert-url
```
## Docker Compose ile Projeyi Başlatma
Ortam değişkenleri (.env.production) ayarlandıktan ve gerekli yapılandırmalar yapıldıktan sonra, Docker konteynerinizi aşağıdaki komutla çalıştırabilirsiniz:
```bash
docker-compose --env-file .env.production up --build -d
```
### Komutun Açıklaması:
- **`--env-file .env.production`**: Bu parametre, Docker'ın **.env.production** dosyasını kullanarak ortam değişkenlerini yüklemesini sağlar.
- **`up --build`**: Docker Compose ile servisi başlatır ve eğer imajlar yoksa ya da değişiklik varsa yeniden build eder.
- **`-d`**: Bu parametre, Docker konteynerinin arka planda (detached mode) çalışmasını sağlar.

### Docker Komutunu Çalıştırdıktan Sonra:

1. **Konteynerin Başarıyla Çalıştığını Doğrulayın**:
- Docker konteynerlerinin doğru şekilde çalışıp çalışmadığını kontrol etmek için şu komutu kullanabilirsiniz:
```bash
docker ps
```
Bu komut, çalışan konteynerlerin listesini gösterir ve `vault-management-container` adındaki konteynerin çalıştığını görmelisiniz.

2. **Uygulamayı Kontrol Edin**:
- Uygulamanız varsayılan olarak 3001 portunda çalışıyor olacak. Şu URL'den uygulamanızın çalışıp çalışmadığını kontrol edebilirsiniz:
```
http://localhost:3001
```
3. **Logları Kontrol Edin**:
- Eğer bir sorun yaşıyorsanız, konteyner loglarını inceleyerek sorunu teşhis edebilirsiniz:
```bash
docker-compose logs
```
4. **Konteyneri Durdurmak**:
- Uygulamayı durdurmak isterseniz, şu komutu kullanarak tüm konteynerleri kapatabilirsiniz:
```bash
docker-compose down
```
## Firebase Authentication Yapılandırması
### Firebase Authentication ile kullanıcıların giriş yapabilmesi için şu adımları takip edin:
1. **Authentication Paneline Giriş:**
- Firebase Console'da projenize gidin.
- Sol menüde **Authentication** sekmesine tıklayın ve **Sign-in method** bölümüne geçin.

2. **Giriş Yöntemi Ekleme:**
- **Email/Password** oturum açma yöntemini etkinleştirin.
- Bu yöntem, kullanıcıların e-posta ve şifre ile kimlik doğrulaması yapmalarını sağlayacaktır.

3. **Manuel Kullanıcı Oluşturma:**
- Firebase Authentication üzerinde **Users** sekmesine gidin.
- Manuel olarak kullanıcı ekleyin veya Firebase Admin SDK ile kullanıcı oluşturma işlemlerini gerçekleştirin.

---

## Firestore ile Kullanıcı Verisi Saklama

Kullanıcıların oturum açmasının yanı sıra, kullanıcıya ait profil bilgilerini **Firestore**'daki **users** koleksiyonunda saklamalısınız. Bu koleksiyon, kimlik doğrulanan kullanıcıların detaylı profil bilgilerini barındıracaktır.
### Kullanıcı Kayıt ve Firestore İşlemleri:
Bir kullanıcı **email & password** ile oturum açtıktan sonra, Firebase Authentication'daki verisi ile Firestore'daki **users** koleksiyonundaki veriler birbiriyle ilişkilendirilmelidir. Bu ilişkiyi sağlamak için kullanıcının **uid** değeri kullanılır.
---
### Firebase ile Oturum Açma ve Kullanıcı Bilgisi Kaydetme:
Firebase Authentication ile kullanıcının kaydını yaptıktan sonra, bu kullanıcıyı **Firestore**'da da saklamak için aşağıdaki adımları takip edebilirsiniz:

1. **Kullanıcı Oluşturma ve Firestore'da Kaydetme (Sign-up)**:
Firebase Authentication ile yeni kullanıcı oluşturulduktan sonra, kullanıcı bilgilerini Firestore'daki **users** koleksiyonuna kaydedin.

```javascript
import { getAuth, createUserWithEmailAndPassword } from 'firebase/auth';
import { doc, setDoc } from 'firebase/firestore';
import { db } from '../../../firebase'; // Firestore bağlantısı
const auth = getAuth();
export const signUpUser = async (email, password, userData) => {
try {
const userCredential = await createUserWithEmailAndPassword(auth, email, password);
const user = userCredential.user;
await setDoc(doc(db, 'users', user.uid), {
email: user.email,
name: userData.name,
avatarURL: userData.avatarURL || '',
role: userData.role || 'user',
});
console.log('Kullanıcı başarıyla kaydedildi:', user.uid);
return user.uid;
} catch (error) {
console.error('Kullanıcı kaydedilirken hata oluştu:', error);
throw error;
}
};
```

2. **Kullanıcı Giriş Yapma ve Verileri Getirme (Sign-in)**:
Kullanıcı giriş yaptıktan sonra, Firestore'dan kullanıcının profil bilgilerini getirin.
```javascript
import { getAuth, signInWithEmailAndPassword } from 'firebase/auth';
import { doc, getDoc } from 'firebase/firestore';
import { db } from '../../../firebase'; // Firestore bağlantısı
const auth = getAuth();
export const signInUser = async (email, password) => {
try {
const userCredential = await signInWithEmailAndPassword(auth, email, password);
const user = userCredential.user;
const userDocRef = doc(db, 'users', user.uid);
const userDoc = await getDoc(userDocRef);
if (userDoc.exists()) {
const userData = userDoc.data();
console.log('Kullanıcı verisi:', userData);
return { ...userData, uid: user.uid };
} else {
console.log('Kullanıcı Firestore'da bulunamadı.');
return null;
}
} catch (error) {
console.error('Kullanıcı girişinde hata oluştu:', error);
throw error;
}
};
```

### Firestore Güvenlik Kuralları

Firestore güvenlik kuralları, uygulamanın veri erişim ve manipülasyon haklarını kontrol eder. Test ortamında, veritabanına herkesin erişmesine izin vermek için basit bir yapılandırma kullanabilirsiniz. Daha sonra bu kurallar üretim ortamında sıkılaştırılmalıdır.

#### Firestore Güvenlik Kurallarını Ayarlama

1. **Firebase Console** üzerinden projenize gidin.
2. Sol menüden **Firestore Database**'e tıklayın.
3. **Rules** sekmesine geçin.
4. Aşağıdaki kuralları ekleyin:


```plaintext
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}
```
Bu kurallar, herkese okuma ve yazma izni verir. Bu sadece test amaçlıdır ve verilerinizin güvenliği için üretim ortamında kullanılmamalıdır.

#### Üretim Ortamı İçin Öneriler

Üretim ortamında, sadece kimliği doğrulanmış kullanıcıların okuma ve yazma işlemlerine izin veren kurallar kullanmalısınız. Örneğin:

```plaintext
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
```


Bu kural, yalnızca oturum açmış kullanıcıların verilere erişmesine izin verir. Üretim ortamında daha güvenli bir yapı sağlar.


---

Not
Bu proje, gelecekte npm modülü olarak kullanılmak üzere hazırlanmıştır. Şu anda modül desteği geliştirme aşamasındadır ve tamamlandığında npm üzerinden kullanıma sunulacaktır. Projenin ilk aşamalarında sadece npm üzerinde yayınlanacak olup, GitHub Packages'a eklenmesine gerek duyulmamaktadır.

İleride, modül desteği tamamlandığında ve npm'ye yayınlandığında, daha fazla entegrasyon ve genişletilebilirlik sağlayacak şekilde düzenlenecektir.

1.0.0 sürümü için **features** milestonelarına ve ilgili **issue**lara göre güncellemeler belirtilecektir.
Loading

0 comments on commit 58fd9c3

Please sign in to comment.