# Hướng Dẫn Cấu Hình Discord OAuth2

Để bot của bạn có thể được phép trong ứng dụng Discord khi người chơi liên kết, bạn cần cấu hình OAuth2 trên Discord Developer Portal.

## Bước 1: Truy cập Discord Developer Portal

1. Đi đến: https://discord.com/developers/applications
2. Đăng nhập với tài khoản Discord của bạn
3. Chọn ứng dụng của bạn (hoặc tạo mới nếu chưa có)

## Bước 2: Lấy Client ID và Client Secret

### Lấy Client ID:
1. Vào **OAuth2** → **General Information**
2. Copy **Client ID** (đây là Application ID của bạn)
3. Dán vào file `server.js` hoặc biến môi trường `DISCORD_CLIENT_ID`

### Lấy Client Secret:
1. Vào **OAuth2** → **General Information**
2. Click **Reset Secret** (nếu chưa có) hoặc **Copy** (nếu đã có)
3. ⚠️ **LƯU Ý**: Client Secret chỉ hiển thị một lần, hãy lưu lại ngay!
4. Dán vào file `server.js` hoặc biến môi trường `DISCORD_CLIENT_SECRET`

## Bước 3: Cấu Hình Redirect URI

1. Vào **OAuth2** → **General Information**
2. Scroll xuống phần **Redirects**
3. Click **Add Redirect**
4. Thêm redirect URI của bạn:
   - **Development**: `http://localhost:3000/discord/callback`
   - **Production**: `https://yourdomain.com/discord/callback`
5. Click **Save Changes**

⚠️ **QUAN TRỌNG**: Redirect URI trong code phải **KHỚP CHÍNH XÁC** với URI đã đăng ký trong Discord Developer Portal (bao gồm cả http/https và port).

## Bước 4: Cấu Hình OAuth2 Scopes (Quyền)

1. Vào **OAuth2** → **URL Generator**
2. Chọn các **Scopes** (quyền) cần thiết:
   - ✅ **identify** - Lấy thông tin cơ bản của user
   - ✅ **guilds.join** - Thêm user vào server (nếu cần)
3. Copy **Generated URL** để test (tùy chọn)

Hoặc trong code, scopes đã được cấu hình sẵn:
```javascript
const scopes = ['identify', 'guilds.join'];
```

## Bước 5: Cập Nhật Code

### Cách 1: Sử dụng biến môi trường (Khuyến nghị)

Tạo file `.env`:
```env
DISCORD_CLIENT_ID=your_client_id_here
DISCORD_CLIENT_SECRET=your_client_secret_here
DISCORD_REDIRECT_URI=http://localhost:3000/discord/callback
```

Cài đặt `dotenv`:
```bash
npm install dotenv
```

Thêm vào đầu `server.js`:
```javascript
require('dotenv').config();
```

### Cách 2: Cập nhật trực tiếp trong code

Mở `server.js` và tìm:
```javascript
const DISCORD_CLIENT_ID = process.env.DISCORD_CLIENT_ID || 'YOUR_CLIENT_ID_HERE';
const DISCORD_CLIENT_SECRET = process.env.DISCORD_CLIENT_SECRET || 'YOUR_CLIENT_SECRET_HERE';
const DISCORD_REDIRECT_URI = process.env.DISCORD_REDIRECT_URI || `http://localhost:${PORT}/discord/callback`;
```

Thay thế các giá trị:
- `YOUR_CLIENT_ID_HERE` → Client ID của bạn
- `YOUR_CLIENT_SECRET_HERE` → Client Secret của bạn
- `http://localhost:3000/discord/callback` → Redirect URI của bạn

## Bước 6: Kiểm Tra Bot Permissions

Đảm bảo bot của bạn có các quyền cần thiết trong Discord server:

1. Vào **OAuth2** → **URL Generator**
2. Chọn **Bot** trong **Scopes**
3. Chọn các **Bot Permissions**:
   - ✅ **Read Messages/View Channels**
   - ✅ **Send Messages**
   - ✅ **Manage Channels** (nếu cần thêm user vào channel)
4. Copy **Bot Invite URL** và mời bot vào server

## Bước 7: Test OAuth2 Flow

1. Khởi động server:
   ```bash
   npm start
   ```

2. Mở trình duyệt và truy cập:
   ```
   http://localhost:3000/discord/authorize?identifier=test123
   ```

3. Bạn sẽ được redirect đến Discord để authorize
4. Sau khi authorize, bạn sẽ được redirect về callback URL
5. Kiểm tra console để xem log

## Cách Sử Dụng Trong Game

Khi người chơi cần liên kết Discord:

1. Game gọi API: `POST /game/discord.php?work=validate`
2. Nếu user chưa được authorize, server trả về:
   ```json
   {
     "success": false,
     "needsAuth": true,
     "oauthUrl": "http://yourdomain.com/discord/authorize?identifier=player123"
   }
   ```
3. Game mở browser với URL `oauthUrl`
4. User authorize trên Discord
5. Discord redirect về callback
6. Server lưu thông tin user
7. User có thể đóng browser và quay lại game

## Troubleshooting

### Lỗi: "Invalid redirect_uri"
- Kiểm tra redirect URI trong code có khớp với Discord Developer Portal
- Đảm bảo không có trailing slash hoặc khoảng trắng

### Lỗi: "Invalid client"
- Kiểm tra Client ID và Client Secret đã đúng chưa
- Đảm bảo không có khoảng trắng thừa

### Lỗi: "Access denied"
- Kiểm tra bot đã được mời vào server chưa
- Kiểm tra bot có đủ permissions không

### User không được thêm vào channel
- Kiểm tra bot có quyền "Manage Channels" không
- Kiểm tra channel ID có đúng không
- Kiểm tra bot có trong server không

## Bảo Mật

⚠️ **QUAN TRỌNG**:
- **KHÔNG BAO GIỜ** commit Client Secret vào Git
- Sử dụng biến môi trường hoặc file config riêng
- Thêm `.env` vào `.gitignore`
- Sử dụng HTTPS trong production
- Giới hạn redirect URI chỉ cho domain của bạn

## Tài Liệu Tham Khảo

- Discord OAuth2 Documentation: https://discord.com/developers/docs/topics/oauth2
- Discord Developer Portal: https://discord.com/developers/applications
