Discord botunuzun kodu ne kadar iyi olursa olsun, onu Discord'a bağlayan şey tek bir metin dizisidir: bot token. Token, botun şifresidir; Gateway bağlantısında ve REST API isteklerinde botun kimliğini kanıtlar. Bu yüzden bir bot projesindeki en hassas bilgi kod değil, token'dır.

Bu yazıda token'ın ne olduğunu, Developer Portal'da gördüğünüz Application ID, Public Key ve Client Secret değerlerinden farkını, token'ı .env ve .gitignore ile nasıl saklayacağınızı, sızdığında saldırganın neler yapabileceğini ve hemen ne yapmanız gerektiğini anlatıyoruz. Botunuzu henüz oluşturmadıysanız Discord bot nasıl yapılır rehberiyle başlayın.

Bot token nedir?

Bot token nedir? Bir kişi adına değil, bot kullanıcısı olarak kimlik doğrular., Gateway bağlantılarında ve REST API çağrılarının çoğunda kullanılır., Botun sunucuya eklenirken...

Discord'un OAuth2 and Permissions sayfasına göre bot token, Developer Portal'da bir bot kullanıcısı oluşturduğunuzda üretilir ve kodunuzun bot kullanıcısı olarak kimlik doğrulamasını sağlar. Belgede özetlenen özellikleri şunlardır:

  • Bir kişi adına değil, bot kullanıcısı olarak kimlik doğrular.
  • Gateway bağlantılarında ve REST API çağrılarının çoğunda kullanılır.
  • Botun sunucuya eklenirken aldığı izinleri taşır.
  • Şifre gibi korunmalı, asla herkese açık bir yere konmamalıdır.

Kütüphane kullanırken token'ı yalnızca bir kez, giriş fonksiyonuna verirsiniz (client.login() veya bot.run()). Ham HTTP istekleri yapıyorsanız token, Authorization başlığında Bot önekiyle gönderilir:

text
Authorization: Bot BOT_TOKENINIZ

Token, Client Secret, Public Key ve Application ID farkı

Developer Portal'da birbirine benzeyen birkaç değer vardır ve yeni başlayanlar bunları sık karıştırır. discord.js rehberi de bu hataya dikkat çekiyor: kopyaladığınız değer çok daha kısaysa büyük ihtimalle token yerine client secret'ı almışsınızdır.

DeğerNeredeNe içinGizli mi?
Application IDGeneral InformationUygulamanın kimliği; davet linkinde client_id, komut kaydında kullanılırHayır, herkese açık olabilir
Public KeyGeneral InformationHTTP interactions botlarında, gelen isteğin imzasını (X-Signature-Ed25519) doğrulamakHayır, adı üstünde açık anahtar
Client SecretOAuth2 sayfasıOAuth2 akışlarında (ör. "Discord ile giriş") kodu erişim token'ına çevirmekEvet
Bot TokenBot sayfası, "Reset Token"Botun Gateway ve REST API'ye bot olarak giriş yapmasıEvet, en hassas değer

İki "token" türünü de ayırmak gerekir. OAuth2 kullanıcı token'ı, bir kullanıcının onay verdiği scope'larla uygulamanıza o kullanıcı adına işlem yapma yetkisi verir ve kısa ömürlüdür, yenilenmesi gerekir. Interaction token ise her etkileşimle gelir; Discord belgesine göre 15 dakika geçerlidir ve yalnızca o etkileşime yanıt/takip mesajı göndermek içindir. Bot token'ı ise siz sıfırlayana kadar geçerlidir.

Client secret özellikle "Discord ile giriş yap" gibi web akışlarında kullanılır; bu akışın genel mantığını OAuth2 ve OIDC rehberi yazısında bulabilirsiniz.

Token nasıl alınır ve neden bir kez gösterilir?

Developer Portal'da uygulamanızı açın, sol menüden "Bot" sayfasına gidin ve "Reset Token" düğmesine basıp onaylayın. Discord'un başlangıç rehberine göre token'ı yeniden üretmediğiniz sürece tekrar göremezsiniz; bu yüzden güvenli bir yerde (ör. bir parola yöneticisinde) saklamanız önerilir. Token'ı kaybettiyseniz tek yol yeniden sıfırlamaktır ve sıfırlama tüm eski token'ları geçersiz kılar.

Token'ı güvenli saklamak: .env ve .gitignore

Token'ı güvenli saklamak: .env ve .gitignore: Node.js (discord.js), Python (discord.py), .gitignore

Token'ı kaynak koduna yazmak en sık yapılan hatadır. Kod bir gün GitHub'a gönderilir, bir arkadaşla paylaşılır ya da ekran görüntüsünde görünür. Doğru yöntem, token'ı ortam değişkeninde tutmak ve kodda yalnızca değişkenin adını kullanmaktır.

Node.js (discord.js)

bash
# .env
DISCORD_TOKEN=buraya-bot-tokeniniz
javascript
// index.js
const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({ intents: [GatewayIntentBits.Guilds] });

client.login(process.env.DISCORD_TOKEN);
bash
node --env-file=.env index.js

discord.js rehberi, .env dosyasını okumak için Node.js'in yerleşik --env-file bayrağını öneriyor; Bun ise .env dosyalarını kendiliğinden okur. Bu şekilde okunan değerler her zaman metin (string) olarak gelir.

Python (discord.py)

python
import os
import discord

intents = discord.Intents.default()
client = discord.Client(intents=intents)

client.run(os.getenv('DISCORD_TOKEN'))

Python tarafında değişkeni terminalde, bir süreç yöneticisinin ortam dosyasında (ör. systemd EnvironmentFile=) veya Docker'ın ortam değişkenleriyle verebilirsiniz.

.gitignore

Git kullanıyorsanız .env dosyasını sürüm kontrolüne asla eklemeyin. Proje kökündeki .gitignore dosyası bunu sağlar:

bash
# .gitignore
node_modules
.env
config.json

Token'ı config.json içinde tutuyorsanız o dosyayı da listeye ekleyin. Konunun genel kuralları için .env dosyası ve en iyi pratikler ile .gitignore nedir yazılarına bakabilirsiniz.

Token asla istemci tarafında olmamalı

Token'ı bir web sayfasının JavaScript kodunda, mobil uygulamada, masaüstü uygulamasında ya da bir Discord Activity'nin ön yüzünde kullanmayın. Kullanıcının cihazına giden her kod okunabilir; tarayıcının geliştirici araçlarını açan herkes token'ı görür. Botla etkileşim gereken her işlemi kendi sunucunuzda çalışan bir arka uç üzerinden yapın; istemci yalnızca sizin API'nizle konuşsun. Aynı kural client secret için de geçerlidir: Discord, OAuth2 belgesinde client ID ve client secret bilgilerinin kaynak kodunda bulunmaması konusunda açıkça uyarıyor.

Botu bir paneldeki "dashboard"a bağlıyorsanız da token yalnızca sunucu tarafında, botun çalıştığı süreçte kalmalıdır.

Token sızarsa saldırgan neler yapabilir?

Token sızarsa saldırgan neler yapabilir? Botun bulunduğu her sunucuda spam atmak,, mümkün olduğunca çok kullanıcıya DM ile spam göndermek,, kanalları silmek,, üyeleri atmak veya...

discord.js rehberinin verdiği senaryo, riski iyi özetliyor: token'ı ele geçiren kişi botu kendi botuymuş gibi kullanabilir. Bu da şunlar demektir:

  • Botun bulunduğu her sunucuda spam atmak,
  • mümkün olduğunca çok kullanıcıya DM ile spam göndermek,
  • kanalları silmek,
  • üyeleri atmak veya yasaklamak,
  • botu girdiği tüm sunuculardan çıkarmak.

Saldırganın yapabilecekleri botun izinleriyle sınırlıdır. Bu yüzden davet linkinde Administrator gibi geniş izinler istemek, sızıntının etkisini büyütür. Yalnızca gereken izinleri istemenin pratik tarafı için botu sunucuya ekleme ve bot izinleri ve rol hiyerarşisi yazılarına bakın.

Token sızdığında ilk 5 dakika

  • 1. Hemen sıfırlayın: Developer Portal'da "Bot" sayfasına gidip "Reset Token" düğmesine basın. Bu, eski token'ların hepsini geçersiz kılar ve saldırganın bağlantısını keser.
  • 2. Yeni token'ı her yerde güncelleyin: Sunucudaki .env, systemd ortam dosyası, Docker değişkenleri, CI/CD gizli değişkenleri. Eski token'la çalışan süreç artık giriş yapamaz.
  • 3. Kaynağı kapatın: Token herkese açık bir depoda ise dosyayı kaldırıp .gitignore'a ekleyin. Geçmişte kaldığını unutmayın; sıfırlama yapıldığı için eski değer artık işe yaramaz.
  • 4. Hasarı kontrol edin: Botun bulunduğu sunuculardaki silinen kanal, atılan üye veya beklenmedik mesajları sunucu yöneticilerine bildirin.
  • 5. Nasıl sızdığını bulun: Kodda kalmış bir sabit değer, bir log satırı, paylaşılan bir ekran görüntüsü veya destek kanalına yapıştırılan bir hata çıktısı olabilir.

Üretim ortamında token yönetimi

Botunuzu bir VDS veya VPS üzerinde çalıştırırken de aynı ilke geçerlidir: token koda değil ortama aittir.

  • systemd: Servis dosyasında EnvironmentFile= ile yalnızca botun kullanıcısının okuyabildiği bir dosyayı gösterin (systemd servis dosyası rehberi).
  • Docker: .env dosyasını imaja kopyalamayın, .dockerignore içine ekleyin ve token'ı çalışma zamanında ortam değişkeni olarak verin (Dockerfile yazma rehberi).
  • CI/CD: GitHub Actions gibi araçlarda token'ı repository secret olarak tutun (GitHub Actions ile VPS deploy).
  • Loglar: Hata ayıklarken istemci nesnesini veya ortam değişkenlerinin tamamını loglamayın.

Sunucunun kendisini güvenli tutmak için VPS güvenlik sertleştirme yazısı iyi bir başlangıçtır. Botu sürekli açık tutma adımlarının tamamı Discord botu 7/24 aktif tutma yazısında.

Token ile ilgili hata mesajları

HataAnlamıNe yapmalı
Gateway kapanış kodu 4004 Authentication failedIdentify sırasında gönderilen token yanlışToken'ı doğru kopyaladığınızı, sıfırlanmadığını ve client secret olmadığını kontrol edin
HTTP 401 / JSON kodu 40001 Unauthorizedİstek geçerli bir token taşımıyorAuthorization: Bot ... başlığını ve ortam değişkeninin gerçekten yüklendiğini kontrol edin
Token undefined / NoneOrtam değişkeni okunamadı--env-file bayrağını veya değişken adını kontrol edin

Diğer kodların açıklamaları için Discord API hata kodları yazısına bakın.

Sık Sorulan Sorular

Token'ı GitHub'a yanlışlıkla gönderdim, depoyu silmem yeterli mi?

Hayır. Depoyu silmek veya commit'i geri almak, token'ın daha önce kopyalanmadığını garanti etmez. Tek güvenli adım Developer Portal'da token'ı sıfırlamaktır; ardından yeni token'ı ortam değişkenlerinize yazın.

Application ID'yi paylaşmak tehlikeli mi?

Hayır. Application ID herkese açık bir kimliktir; davet linklerinde zaten görünür. Gizli tutmanız gerekenler bot token'ı ve client secret'tır.

Token'ı şifreleyip koda gömersem güvenli olur mu?

Kodu çalıştıran sürecin token'ı çözebilmesi gerekir; çözme anahtarı da kodun yanındaysa ek bir güvenlik sağlamaz. Doğru çözüm token'ı koddan tamamen ayırıp ortam değişkeni veya bir gizli bilgi yöneticisiyle vermektir.

Kullanıcı hesabımın token'ıyla bot çalıştırabilir miyim?

Bu yazı yalnızca Developer Portal'da oluşturulan bot token'larını anlatır. Botlar için Discord'un sunduğu yol bot kullanıcısıdır; platform kuralları için Discord Developer Policy ve bot kuralları yazısına bakın.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Discord bot nasıl yapılır · Botu sunucuya ekleme · Botu 7/24 aktif tutma · .env dosyası nedir · .gitignore nedir · VPS güvenlik sertleştirme