Kaynak kodundaki sabit kodlu API anahtarları bir güvenlik sorumluluğu taşır. HashiCorp Vault gizli yönetimi merkezileştirir;CaptchaAIAPI anahtarı şifrelenmiş olarak saklanır, çalışma zamanında alınır ve her erişim günlüğe kaydedilir. Bu kılavuz, Apps Kasası'nı CAPTCHA çözümleme hattınıza nasıl entegre edeceğinizi gösterir.
Neden CAPTCHA API Anahtarları için Apps Kasası
| Kasasız | Kasalı |
|---|---|
.env dosyasındaki veya kodundaki API anahtarı |
Anahtar, Apps Kasası'nda şifrelenmiş olarak saklanıyor |
| Anahtar Slack veya e-posta yoluyla paylaşıldı | Kimliği doğrulanmış API aracılığıyla erişim |
| Erişim denetim izi yok | Her okuma kimlikle günlüğe kaydedilir |
| Manuel anahtar döndürme | Otomatik rotasyon desteği |
| Ortamlar arasında aynı anahtar | Politikalara sahip ortam başına anahtarlar |
Önkoşullar
- HashiCorp Vault sunucusu (kendi kendine barındırılan veya HCP Vault)
- Apps Kasası CLI veya API erişimi
- CaptchaAI API anahtarı
- Python 3.8+ veya Node.js 18+
API Anahtarını Apps Kasası'nda saklayın
# Enable the KV secrets engine (if not already enabled)
vault secrets enable -path=secret kv-v2
# Store the CaptchaAI API key
vault kv put secret/captchaai api_key="YOUR_API_KEY"
# Verify
vault kv get secret/captchaai
Bir Kasa Politikası Oluşturun
CAPTCHA çalışanlarını salt okunur erişimle kısıtlayın:
# captcha-worker-policy.hcl
path "secret/data/captchaai" {
capabilities = ["read"]
}
path "secret/metadata/captchaai" {
capabilities = ["read"]
}
Politikayı uygulayın:
vault policy write captcha-worker captcha-worker-policy.hcl
Python Entegrasyonu
# vault_solver.py
import os
import time
import hvac
import requests
# Connect to Vault
vault_client = hvac.Client(
url=os.environ.get("VAULT_ADDR", "http://127.0.0.1:8200"),
token=os.environ.get("VAULT_TOKEN"),
)
def get_api_key():
"""Retrieve CaptchaAI API key from Vault."""
secret = vault_client.secrets.kv.v2.read_secret_version(
path="captchaai",
mount_point="secret",
)
return secret["data"]["data"]["api_key"]
class CaptchaSolver:
"""CAPTCHA solver with Vault-managed credentials."""
def __init__(self):
self.api_key = get_api_key()
self.session = requests.Session()
self._key_fetched_at = time.time()
self._key_refresh_interval = 3600 # Re-fetch key hourly
def _refresh_key_if_needed(self):
"""Periodically refresh the key from Vault."""
if time.time() - self._key_fetched_at > self._key_refresh_interval:
self.api_key = get_api_key()
self._key_fetched_at = time.time()
def solve(self, sitekey, pageurl):
"""Solve reCAPTCHA v2 using Vault-managed key."""
self._refresh_key_if_needed()
# Submit
resp = self.session.get("https://ocr.captchaai.com/in.php", params={
"key": self.api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": "1",
})
result = resp.json()
if result.get("status") != 1:
raise Exception(f"Submit failed: {result.get('request')}")
task_id = result["request"]
time.sleep(15)
for _ in range(25):
poll = self.session.get("https://ocr.captchaai.com/res.php", params={
"key": self.api_key,
"action": "get",
"id": task_id,
"json": "1",
})
poll_result = poll.json()
if poll_result.get("status") == 1:
return poll_result["request"]
if poll_result.get("request") != "CAPCHA_NOT_READY":
raise Exception(f"Error: {poll_result.get('request')}")
time.sleep(5)
raise Exception("Timeout")
# Usage
solver = CaptchaSolver()
token = solver.solve(
"6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"https://www.google.com/recaptcha/api2/demo"
)
print(f"Token: {token[:30]}...")
JavaScript Entegrasyonu
// vault_solver.js
const axios = require('axios');
const VAULT_ADDR = process.env.VAULT_ADDR || 'http://127.0.0.1:8200';
const VAULT_TOKEN = process.env.VAULT_TOKEN;
async function getApiKey() {
const resp = await axios.get(
`${VAULT_ADDR}/v1/secret/data/captchaai`,
{ headers: { 'X-Vault-Token': VAULT_TOKEN } }
);
return resp.data.data.data.api_key;
}
class CaptchaSolver {
constructor() {
this.apiKey = null;
this.keyFetchedAt = 0;
this.refreshInterval = 3600000; // 1 hour
}
async init() {
this.apiKey = await getApiKey();
this.keyFetchedAt = Date.now();
}
async refreshKeyIfNeeded() {
if (Date.now() - this.keyFetchedAt > this.refreshInterval) {
this.apiKey = await getApiKey();
this.keyFetchedAt = Date.now();
}
}
async solve(sitekey, pageurl) {
await this.refreshKeyIfNeeded();
const submit = await axios.get('https://ocr.captchaai.com/in.php', {
params: {
key: this.apiKey, method: 'userrecaptcha',
googlekey: sitekey, pageurl, json: '1',
},
});
if (submit.data.status !== 1) throw new Error(submit.data.request);
const taskId = submit.data.request;
await new Promise(r => setTimeout(r, 15000));
for (let i = 0; i < 25; i++) {
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: this.apiKey, action: 'get', id: taskId, json: '1' },
});
if (poll.data.status === 1) return poll.data.request;
if (poll.data.request !== 'CAPCHA_NOT_READY') throw new Error(poll.data.request);
await new Promise(r => setTimeout(r, 5000));
}
throw new Error('Timeout');
}
}
(async () => {
const solver = new CaptchaSolver();
await solver.init();
const token = await solver.solve(
'6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
'https://www.google.com/recaptcha/api2/demo'
);
console.log(`Token: ${token.slice(0, 30)}...`);
})();
Kimlik Doğrulama Yöntemleri
Apps Kasası, çalışanlar için birden fazla kimlik doğrulama yöntemini destekler:
| Yöntem | En İyisi | Kurulum |
|---|---|---|
| Jeton | Geliştirme, CI/CD | VAULT_TOKEN env var |
| Uygulama Rolü | Üretim hizmetleri | Rol Kimliği + Gizli Kimlik |
| Kubernet'ler | K8'in iş yükleri | Hizmet hesabı JWT |
| AWS IAM | EC2/Lambda çalışanları | Örnek rolü |
AppRole Örneği (Üretim için Önerilen)
# AppRole authentication — no static token needed
vault_client = hvac.Client(url=os.environ["VAULT_ADDR"])
vault_client.auth.approle.login(
role_id=os.environ["VAULT_ROLE_ID"],
secret_id=os.environ["VAULT_SECRET_ID"],
)
# Now read the secret
secret = vault_client.secrets.kv.v2.read_secret_version(path="captchaai")
api_key = secret["data"]["data"]["api_key"]
Anahtar Rotasyon İş Akışı
- CaptchaAI kontrol panelinde yeni CaptchaAI API anahtarı oluşturun
- Kasayı Güncelle:
vault kv put secret/captchaai api_key="NEW_KEY" - Çalışanlar bir sonraki yenileme döngüsünde yeni anahtarı otomatik olarak alır
- Tüm çalışanlar yenilendikten sonra CaptchaAI panosundaki eski anahtarı iptal edin
Kod değişikliği veya dağıtım gerekmez.
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
Vault'tan 403 Forbidden |
Politika okumaya izin vermiyor | captcha-worker-policy.hcl yolunu kontrol edin |
VAULT_TOKEN'nin süresi doldu |
Token TTL'si aşıldı | Otomatik olarak yenilenebilir belirteçler için AppRole'u kullanın |
| Anahtar yenilenmiyor | Yenileme aralığı çok uzun | _key_refresh_interval'yi azaltın |
| Apps Kasası kullanılamıyor | Ağ veya sunucu sorunu | Geri dönüş ile anahtarı yerel olarak önbelleğe alın |
SSS
Vault çökerse ne olur?
API anahtarını ilk alındığında bellekte önbelleğe alın. Yenileme sırasında Apps Kasası kullanılamıyorsa önbelleğe alınan anahtarı kullanmaya devam edin ve hatayı günlüğe kaydedin.
Ortam başına bir anahtar saklamalı mıyım?
Evet. Ayrı Vault yolları kullanın: secret/captchaai/dev, secret/captchaai/staging, secret/captchaai/prod.
Vault yerine AWS Secrets Manager'ı kullanabilir miyim?
Evet. Model aynıdır: Çalışma zamanında sırrı boto3 kullanarak AWS Secrets Manager'dan alın. Temel prensip (sabit kodlanmış anahtar yok, dağıtım olmadan döndürme) aynı kalıyor.
İlgili Makaleler
- Captchaai Ip Beyaz Listeye Alma API Anahtar Güvenliği
- Captchaai Api Anahtar Rotasyonu
- Google Cloud İşlevleri Captchaai Entegrasyonu
Sonraki Adımlar
CaptchaAI kimlik bilgilerinizi Vault ile güvence altına alın —API anahtarınızı alın.
İlgili kılavuzlar: