0Pricing
R Academy · Ders

Kimlik Doğrulama ve API Güvenliği

API anahtarı doğrulaması, CORS üstbilgileri ve hız sınırlama filtreleri ekleyin.

Kimlik Doğrulama ve API Güvenliği, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.

API Güvenliği Neden Önemlidir

Plumber API'si herkese açık bir HTTP sunucusudur. Kimlik doğrulama olmadan, bağlantı noktasına erişebilen herkes uç noktalarınızı çağırabilir. Güvenlik katmanları arasında kimlik doğrulama (kimsiniz?), yetkilendirme (ne yapabilirsiniz?), girdi doğrulama ve aktarım güvenliği bulunur.

Ara Katman Yazılımı Olarak Plumber Filtreleri

Plumber'daki filtreler rota işleyicisinden önce çalışır. Her isteği inceleyen ara katman yazılımı eklemek için pr_filter(name, function(req, res){...}) kullanın. Sonraki filtreye veya rotaya geçmek için plumber::forward() çağrısı yapın; isteği reddetmek için erken dönün.

# library(plumber)
# pr <- plumb('api.R')
# pr |>
#   pr_filter('logger', function(req, res) {
#     cat(req$REQUEST_METHOD, req$PATH_INFO, '
')
#     plumber::forward()  # must call to continue
#   }) |>
#   pr_run(port = 8000)

API Anahtarı Kimlik Doğrulama Filtresi

Sunucudan sunucuya API'leri için en yaygın basit kimlik doğrulama düzeni, bir üst bilgide gönderilen statik API anahtarıdır. Filtre, her istekte üst bilgiyi denetler ve eksik veya hatalıysa 401 döndürür.

# In api.R:
# VALID_KEY <- Sys.getenv('API_SECRET_KEY')
#
# #* @filter auth
# function(req, res) {
#   key <- req$HTTP_X_API_KEY
#   if (is.null(key) || key != VALID_KEY) {
#     res$status <- 401L
#     return(list(error = 'Unauthorized'))
#   }
#   plumber::forward()
# }

Authorization Üst Bilgisini Denetleme

Taşıyıcı belirteçleri Authorization: Bearer <token> üst bilgisinde gönderilir. Bu bilgiye req$HTTP_AUTHORIZATION üzerinden erişin. Belirteç bölümünü çıkarmak için strsplit() ile ayrıştırın, ardından kendi depolamanızda doğrulayın.

# #* @filter bearer_auth
# function(req, res) {
#   auth_header <- req$HTTP_AUTHORIZATION
#   if (is.null(auth_header) || !startsWith(auth_header, 'Bearer ')) {
#     res$status <- 401L
#     return(list(error = 'Bearer token required'))
#   }
#   token <- substring(auth_header, 8)  # strip 'Bearer '
#   if (!token_is_valid(token)) {
#     res$status <- 401L
#     return(list(error = 'Invalid token'))
#   }
#   plumber::forward()
# }

#* @preempt ile Kimlik Doğrulamayı Atlamak

Bazı uç noktalar (durum denetimleri, herkese açık belgeler) kimlik doğrulamayı atlamalıdır. auth değerinin filtre adıyla eşleştiği durumlarda bunlara #* @preempt auth açıklamasını ekleyin. Plumber, bu filtreyi atlayarak isteği doğrudan işleyiciye yönlendirir.

# #* Health check — no auth required
# #* @preempt auth
# #* @get /ping
# function() {
#   list(status = 'ok', time = as.character(Sys.time()))
# }
#
# #* Protected endpoint — goes through auth filter
# #* @get /data
# function() {
#   list(secret = 'sensitive data')
# }

pr_cors() ile CORS

API'niz farklı bir etki alanındaki tarayıcıdan çağrılıyorsa CORS'u (Kökenler Arası Kaynak Paylaşımı) etkinleştirmeniz gerekir. Ham üst bilgileri elle yazmadan izin verilen kökenleri, yöntemleri ve üst bilgileri yapılandırmak için pr_cors() kullanın.

# library(plumber)
# pr <- plumb('api.R')
# pr |>
#   pr_cors(
#     origin            = 'https://myapp.example.com',
#     methods           = c('GET', 'POST'),
#     headers           = c('Content-Type', 'X-API-Key'),
#     credentials       = TRUE
#   ) |>
#   pr_run(port = 8000)

Girdi Temizleme — Kullanıcı Girdisine Asla Güvenmeyin

Girdileri sorgularda veya dosya işlemlerinde kullanmadan önce her zaman doğrulayın ve temizleyin:

  • Türü denetleyin: is.numeric(), is.character()
  • Aralığı denetleyin: id >= 1 && id <= 1e9
  • Beklenmeyen karakterleri reddedin: grepl('[^a-zA-Z0-9_]', name)
  • Kullanıcı dizelerini doğrudan SQL içine hiçbir zaman yerleştirmeyin; parametreli sorgular kullanın
# #* @post /search
# function(req, res) {
#   body <- jsonlite::fromJSON(req$postBody)
#   query <- body$query
#   if (!is.character(query) || nchar(query) > 200) {
#     res$status <- 400L
#     return(list(error = 'query must be a string <= 200 chars'))
#   }
#   if (grepl('[;\'"]', query)) {
#     res$status <- 400L
#     return(list(error = 'Invalid characters in query'))
#   }
#   list(results = search_db(query))
# }

İstek Hızı Sınırlama Kavramları

Plumber'da yerleşik bir istek hızı sınırlayıcı yoktur; ancak istek sayılarını IP başına izlemek için paylaşılan bir ortam kullanan bir filtreyle bunu uygulayabilirsiniz:

  • Her isteğin zaman damgasını IP adresine göre bir R ortamına kaydedin
  • Pencere içindeki sayı sınırı aşarsa 429 ile reddedin
  • Üretimde, istek hızı sınırlama için nginx gibi bir ters vekil sunucu kullanın
# request_log <- new.env()
#
# #* @filter rate_limit
# function(req, res) {
#   ip <- req$REMOTE_ADDR
#   now <- as.numeric(Sys.time())
#   if (!exists(ip, envir = request_log)) assign(ip, c(), envir = request_log)
#   times <- get(ip, envir = request_log)
#   times <- times[times > now - 60]   # last 60 seconds
#   if (length(times) >= 60) { res$status <- 429L; return(list(error='Too Many Requests')) }
#   assign(ip, c(times, now), envir = request_log)
#   plumber::forward()
# }

API Anahtarlarını Güvenli Biçimde Saklama

Gizli bilgileri kaynak dosyalara hiçbir zaman sabit olarak yazmayın. Bunları ortam değişkenlerinde saklayın ve başlangıçta Sys.getenv() ile okuyun. Yerel olarak bir .env dosyası kullanın (git dışında bırakın); üretimde ise gizli bilgileri dağıtım ortamı üzerinden aktarın.

# In .env (never commit this file):
# API_SECRET_KEY=my_super_secret_key_here
#
# In api.R:
# VALID_KEY <- Sys.getenv('API_SECRET_KEY', unset = '')
# if (nchar(VALID_KEY) == 0) stop('API_SECRET_KEY not set')
#
# Load .env locally (devtools::load_dot_env or Sys.setenv):
# readRenviron('.env')
cat('Sys.getenv reads API keys without exposing them in source
')

Kullanıcı Bağlamını İsteğe Ekleme

Kimlik doğrulama filtresinde bir belirteci doğruladıktan sonra, kodu çözülmüş kullanıcı bilgilerini req nesnesine ekleyin; böylece sonraki işleyiciler bilgileri yeniden doğrulama yapmadan kullanabilir. req üzerindeki özel alanlar filtre zinciri boyunca korunur.

# #* @filter auth
# function(req, res) {
#   token <- req$HTTP_AUTHORIZATION
#   user <- validate_token(token)  # returns list(id=1, role='admin')
#   if (is.null(user)) { res$status <- 401L; return(list(error='Unauthorized')) }
#   req$user <- user   # attach to request
#   plumber::forward()
# }
#
# #* @get /profile
# function(req) {
#   list(user_id = req$user$id, role = req$user$role)
# }

tryCatch ile Hata İşleme

Beklenmeyen hataları yakalamak ve çalışanı çökertmek ya da çağırana yığın izini sızdırmak yerine düzenli bir 500 yanıtı döndürmek için uç nokta mantığınızı tryCatch() içine alın.

# #* @get /risky/<id:int>
# function(id, res) {
#   tryCatch({
#     result <- risky_db_call(id)
#     list(data = result)
#   }, error = function(e) {
#     message('Error in /risky: ', conditionMessage(e))
#     res$status <- 500L
#     list(error = 'Internal server error')
#   })
# }

Hızlı Kontrol: @preempt Açıklaması

#* @preempt auth açıklaması, bir Plumber uç noktası için ne yapar?

API Güvenliği Özeti

Bir Plumber API'sini güvenli hale getirmek, katmanlı savunmalar kullanmayı gerektirir:

  • pr_filter('auth', ...) — ara katman yazılımında her isteği inceleme
  • req$HTTP_AUTHORIZATION / req$HTTP_X_API_KEY — kimlik doğrulama üst bilgilerini okuma
  • #* @preempt auth — herkese açık uç noktalar için kimlik doğrulamayı atlama
  • pr_cors() — tarayıcının kökenler arası erişimini yapılandırma
  • Herhangi bir veritabanı veya dosya işleminden önce girdi doğrulama
  • Gizli bilgiler için Sys.getenv() kullanma; anahtarları hiçbir zaman sabit olarak yazmama

Sıkça Sorulan Sorular

“Kimlik Doğrulama ve API Güvenliği” dersi ücretsiz mi?

Evet — “Kimlik Doğrulama ve API Güvenliği” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.

“Kimlik Doğrulama ve API Güvenliği” dersinde ne öğreneceğim?

API anahtarı doğrulaması, CORS üstbilgileri ve hız sınırlama filtreleri ekleyin. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

R Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Kimlik Doğrulama ve API Güvenliği” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu R Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Plumber ve REST'e Giriş
  2. GET ve POST Uç Noktaları Oluşturma
  3. Kimlik Doğrulama ve API Güvenliği
  4. Plumber API'lerini Üretim Ortamına Dağıtma
← R Academy Sayfasına Dön