Files
remote-sensing/COGNITO_GUIDE.md
T

317 lines
6.7 KiB
Markdown

# Cognito Authentication Guide
# Hướng Dẫn Xác Thực Cognito
## ✅ Kết quả Test
### Authentication Flow thành công:
```
Cognito Tokens → AWS Credentials → S3 Access
✓ ✓ ✓
```
### Thông tin User từ Cognito:
- **Username**: hienm2523001
- **Name**: Hien Phan
- **Email**: hienm2523001@gstudent.ctu.edu.vn
- **Groups**:
- default-group
- allocation:R-19244:CSIRO and Vietnam partners
- **Token Expiry**: ~8 giờ từ khi login
### S3 Buckets có thể truy cập:
✅ sentinel-cogs (us-west-2)
✅ sentinel-s2-l2a (eu-central-1)
---
## 📁 Files đã tạo
### 1. `cognito_auth.py`
Module Python để xác thực với Cognito tokens
**Tính năng:**
- Load Cognito tokens từ file
- Decode và hiển thị thông tin user
- Load AWS credentials (đã được EASI exchange từ Cognito)
- Set credentials vào environment
- Test S3 access
### 2. `test_cognito_s3.py`
Script test đầy đủ flow: Cognito → AWS → S3
---
## 🚀 Cách sử dụng
### Quick Test
```bash
python test_cognito_s3.py
```
### Sử dụng trong code
#### 1. Load Cognito authentication:
```python
from cognito_auth import CognitoAuthenticator
# Initialize
auth = CognitoAuthenticator(region='ap-southeast-1')
# Load tokens và credentials
auth.load_tokens_from_file('train_files/crediential.txt')
# Xem thông tin user
auth.print_token_info()
# Get AWS credentials
auth.get_credentials_from_cognito()
# Set vào environment
auth.set_environment_credentials()
```
#### 2. Truy cập S3:
```python
# Test S3 access
auth.test_s3_access('sentinel-cogs', 'us-west-2')
```
#### 3. Sử dụng với datacube:
```python
from datacube.utils.rio import configure_s3_access
# Configure S3 access
configure_s3_access(
aws_unsigned=False,
region_name='us-west-2',
cloud_defaults=True
)
# Load dữ liệu như bình thường
```
---
## 🔄 Cấu trúc File Credentials
File `train_files/crediential.txt` chứa:
```bash
# AWS Credentials (đã được exchange từ Cognito bởi EASI)
export AWS_ACCESS_KEY_ID="ASIA..."
export AWS_SECRET_ACCESS_KEY="..."
export AWS_SESSION_TOKEN="..."
# Cognito Tokens
Cognito: eyJraWQi... # Access Token
ID: eyJraWQi... # ID Token
```
---
## 📊 So sánh 2 phương pháp
| Feature | Direct Credentials | Cognito Tokens |
|---------|-------------------|----------------|
| **Authentication** | Không có | ✅ User info, groups |
| **S3 Access** | ✅ | ✅ |
| **User Identity** | Chỉ có role ARN | ✅ Username, email, groups |
| **Token Info** | Không | ✅ Expiry time, claims |
| **Security** | Basic | ✅ Better (identity-based) |
---
## 💡 Flow hoạt động
### Trong hệ thống EASI:
```
1. User login vào EASI Hub
2. AWS Cognito xác thực
3. Cognito trả về:
- Access Token (authentication)
- ID Token (user info)
4. EASI Backend exchange tokens → AWS Credentials
5. User nhận cả Cognito tokens + AWS credentials
6. Sử dụng credentials để truy cập S3
```
### Trong code của bạn:
```python
# Load từ file
auth.load_tokens_from_file()
# Parse user info
auth.print_token_info()
# Get AWS credentials (đã có sẵn trong file)
auth.get_credentials_from_cognito()
# Set environment
auth.set_environment_credentials()
# Access S3
auth.test_s3_access()
```
---
## ⚙️ Advanced Usage
### Decode token để lấy thông tin:
```python
import jwt
decoded = jwt.decode(id_token, options={"verify_signature": False})
print(decoded)
# {
# 'cognito:username': 'hienm2523001',
# 'email': 'hienm2523001@gstudent.ctu.edu.vn',
# 'cognito:groups': ['default-group', 'allocation:R-19244:...'],
# 'exp': 1772661158,
# ...
# }
```
### Check token expiration:
```python
from datetime import datetime
exp = decoded['exp']
exp_time = datetime.fromtimestamp(exp)
now = datetime.now()
if exp_time > now:
print(f"Token còn hiệu lực đến: {exp_time}")
else:
print("Token đã hết hạn!")
```
### Sử dụng với boto3:
```python
import boto3
s3 = boto3.client(
's3',
aws_access_key_id=auth.aws_credentials['AccessKeyId'],
aws_secret_access_key=auth.aws_credentials['SecretAccessKey'],
aws_session_token=auth.aws_credentials['SessionToken']
)
# List objects
response = s3.list_objects_v2(Bucket='sentinel-cogs', MaxKeys=10)
```
---
## 🔒 Security Notes
### ✅ Best Practices:
- Token có thời hạn (tự động expire sau ~8 giờ)
- Sử dụng HTTPS cho mọi API calls
- KHÔNG commit tokens vào Git
- KHÔNG share tokens công khai
- Refresh tokens khi hết hạn
### ⚠️ Lưu ý:
- Cognito tokens và AWS credentials **ĐỀU CÓ THỜI HẠN**
- Khi hết hạn, cần login lại vào EASI hub
- File `.gitignore` nên bao gồm `train_files/crediential.txt`
---
## 🐛 Troubleshooting
### Error: "Token đã hết hạn"
```
✗ Token EXPIRED at: 2026-03-05 04:52:38
```
**Giải pháp:** Login lại vào EASI hub để lấy tokens mới
### Error: "ModuleNotFoundError: No module named 'jwt'"
```bash
pip install PyJWT
```
### Error: "No AWS credentials available"
**Giải pháp:**
- Check file `train_files/crediential.txt` có đầy đủ không
- Đảm bảo có cả AWS credentials VÀ Cognito tokens
### Error: "AccessDenied" khi truy cập S3
**Giải pháp:**
- Token có thể đã hết hạn
- Bucket có thể yêu cầu quyền cao hơn
- Thử bucket khác (public bucket)
---
## 📚 Dependencies
```bash
pip install boto3 botocore PyJWT datacube rasterio
```
Hoặc:
```bash
pip install -r requirements_api.txt
```
---
## 📞 Contact
- **EASI Asia Support**: CSIRO EASI Hub
- **Project**: R-19244: CSIRO and Vietnam partners
- **Region**: ap-southeast-1
---
## 📝 Example Output
```
======================================================================
Test S3 Access Using Cognito Tokens
======================================================================
[1/5] Loading Cognito tokens from file...
✓ AWS credentials loaded from file
✓ Cognito tokens loaded successfully
[2/5] Displaying token information...
User Information:
Username: hienm2523001
Name: Hien Phan
Email: hienm2523001@gstudent.ctu.edu.vn
Groups: default-group, allocation:R-19244:CSIRO and Vietnam partners
Token expires: 2026-03-05 04:52:38
Time remaining: 7h 45m
[3/5] Getting AWS credentials...
✓ Using AWS credentials loaded from file
[4/5] Configuring environment...
✓ AWS credentials set in environment
[5/5] Configuring datacube S3 access...
✓ Datacube S3 access configured
S3 Access Results:
✓ sentinel-cogs
✓ sentinel-s2-l2a
✓ SUCCESS: Cognito authentication working!
======================================================================
```
---
**Last updated:** March 4, 2026
**Status:** ✅ Working perfectly!