# Checklist Tài Khoản Dịch Vụ

> Biết những tài khoản bên ngoài nào cần có và lý do cần từng cái.

- URL: https://dantech.academy/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-03-service-account-checklist
- Khóa học: [Mobile Action Pro](https://dantech.academy/courses/kotlin-accelerator.md)
- Module: Setup App Chạy Được
- Thời lượng: 14 phút
- Độ khó: beginner
- Truy cập: Miễn phí, đọc toàn bài
- English: https://dantech.academy/en/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-03-service-account-checklist.md

## Mục tiêu

- Nhận diện tài khoản dịch vụ nào cần ngay và tài khoản nào để sau, cho cả Android và iOS
- Làm theo thứ tự setup: xác nhận GitHub trước, rồi tạo Supabase dev project free-tier
- Phân biệt value được phép nằm trong app với secret backend-only như Supabase service role key

---

## Mục Tiêu Bài Học

Sau bài này, bạn sẽ biết:

- Những tài khoản nào cần trước first build, và tài khoản nào để sau cũng được,
- Thứ tự setup an toàn,
- Value nào được phép nằm trong app, value nào không bao giờ.

## Vì Sao Bài Này Tồn Tại

Một mobile app production hiếm khi chỉ chạy trên máy. Nó giao tiếp với auth provider, database, analytics, Remote Config, release dashboard, payment system và đôi khi AI API. App của khóa học chạy trên cả Android và iOS, nên một số dịch vụ có cấu hình riêng cho từng nền tảng.

Người mới hay mở mọi dashboard và tạo mọi account ngay ngày đầu. Việc đó dễ tạo lo lắng về billing và rủi ro lộ secrets trước khi app build được. AI API là chỗ dễ tốn tiền nhất.

## Official Account Links

Chỉ dùng trang official:

| Service             | Trang official                                                                                                                                          | Nó cung cấp gì                                                               | Khi nào cần            |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------- |
| GitHub              | [Tạo tài khoản GitHub](https://docs.github.com/en/get-started/start-your-journey/creating-an-account-on-github), [GitHub CLI](https://cli.github.com/) | Private repo access, terminal authentication, commits, pull requests         | Ngay bây giờ           |
| Supabase            | [Supabase dashboard](https://supabase.com/dashboard/projects), [Supabase API keys](https://supabase.com/docs/guides/api/api-keys)                       | Project URL, publishable key (`sb_publishable_...`), backend-only secret key hoặc service role key | Ngay bây giờ           |
| Firebase            | [Firebase Console](https://console.firebase.google.com/), [Firebase Android setup](https://firebase.google.com/docs/android/setup)                      | Android app registration, `google-services.json`, Analytics, Remote Config   | Trước first build      |
| Google Cloud        | [Google Cloud Console](https://console.cloud.google.com/), [OAuth consent docs](https://developers.google.com/workspace/guides/configure-oauth-consent) | OAuth consent screen, OAuth clients cho Google Sign-In                       | Khi làm Google Sign-In |
| Gemini API          | [Google AI Studio API key page](https://aistudio.google.com/app/apikey), [Gemini API key docs](https://ai.google.dev/gemini-api/docs/api-key)           | API key cho AI hint (trên Android, app đọc key qua Firebase Remote Config)   | Khi làm AI hint        |
| RevenueCat          | [RevenueCat](https://www.revenuecat.com/), [RevenueCat API keys](https://www.revenuecat.com/docs/projects/authentication)                               | Public SDK key cho subscription và paywall                                   | Khi làm premium        |
| Apple Developer     | [Apple Developer Program](https://developer.apple.com/programs/)                                                                                        | Ký app chạy trên iPhone thật, TestFlight, App Store                          | Khi ship iOS           |
| Google Play Console | [Google Play Console](https://play.google.com/console/about/)                                                                                           | Release, app signing, store listing, closed testing                          | Khi ship Android       |

Premium gate mặc định tắt (`premium.gate.enabled` không đặt thì là `false`), nên app chạy được khi chưa có RevenueCat. Chạy app trên iOS Simulator cũng không cần Apple Developer Program.

Nếu dashboard yêu cầu payment information, đọc kỹ và chọn free tier khi có thể. Đừng tạo billing resources production chỉ vì setup wizard gợi ý.

## Thứ Tự Setup Khuyến Nghị

### 1. Xác Nhận GitHub Trước

Kiểm tra email invite cho private repo trước khi kéo code về. Chưa accept invite thì bạn không clone được repo. Nếu đã accept mà vẫn lỗi, liên hệ @dantech0xff qua Telegram.

Sau đó kiểm tra terminal authentication:

```bash
gh auth status
```

Nếu bước này fail, cài GitHub CLI và chạy `gh auth login` trước.

### 2. Tạo Supabase Dev Project

Với mục đích học, free-tier dev project là đủ.

| Value                     | Lấy từ đâu                         | Ghi chú an toàn                                                 |
| ------------------------- | ---------------------------------- | --------------------------------------------------------------- |
| Project URL               | Nút **Connect** trên trang project | Client app dùng được.                                           |
| Publishable key           | Supabase API keys page             | Client app dùng được, nhưng nó vẫn định danh project của bạn.   |
| Service role key          | Supabase API keys page             | Không bao giờ đặt key này trong app Android hay iOS.            |

Service role key bypass Row Level Security, nên chỉ dùng ở backend. App của khóa học không dùng đến nó.

### 3. Chuẩn Bị Firebase Và Google Cloud

- Firebase là nơi register Android app và tải `google-services.json`.
- Google Cloud là nơi quản lý OAuth consent và OAuth clients. Android dùng một web client ID (`google.server.clientId`). iOS cần thêm một iOS OAuth client riêng, chỉ khi bạn chạy bản iOS trên Mac.
- Android package name và SHA-1 fingerprint phải khớp với app bạn test. Bundle ID của iOS phải khớp với iOS OAuth client.

## Security Checklist

Trước khi paste bất kỳ value nào vào project, trả lời ba câu:

1. Value này có được phép nằm trong app, nơi user có thể đọc ra không?
2. File chứa nó đã được Git ignore chưa?
3. Nếu nó bị lộ, mình có rotate được không?

Mọi thứ đóng gói vào app (Android hay iOS) đều có thể bị đọc ra. Supabase publishable key, OAuth client ID và RevenueCat public key được thiết kế để nằm trong app. Supabase secret key (`sb_secret_...`), service role key, database password và keystore password thì không.

---

- Bài trước: [Clone Repo và Mở Project KMP Lần Đầu](https://dantech.academy/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-02-clone-repo-open-project.md)
- Bài tiếp theo: [Setup Supabase SQL, Secrets Và Firebase](https://dantech.academy/courses/kotlin-accelerator/engineer-builder/00-setup-app-running/lesson-04-configure-local-files-secrets.md)
