İçeriğe geç

SwiftPM'de Gizli Anahtarları Git'ten Saklama

SwiftPM ile modülerleştirilmiş uygulamalarında üçüncü parti servis gizli anahtarlarının Git'e commit edilmesini nasıl önleyeceğine dair adım adım bir rehber.

SwiftPM'de Gizli Anahtarları Git'ten Saklama

API anahtarı veya uygulamanız için gereken üçüncü parti servislerin token’ı gibi gizli anahtarları saklamanın bazı geleneksel yöntemlerini bilyor olabilirsin. Ama günümüzde SwiftPM kullanarak uygulamanı modülerleştirme yaklaşımları giderek daha popüler hale geliyor.

Örneğin, Point-Free’nin bu konuda harika bir ücretsiz bölümü var ve Majid Jabrayilov yakın zamanda “Microapps architecture” hakkında 4 bölümlük bir seri yazdı (bölümler 1, 2, 3, 4) — başlamak için ikisini de önerebilirim.

Ayrıca, açık kaynak kütüphanelerde de gizli anahtarları saklamak isteyebilirsin, örneğin kütüphanenin kullanıcılarının kendi token’larını sağlayacağı ama senin testlerinin kendi token’ınla çalışmasını istediğin üçüncü parti servis entegrasyonunun birim testlerinde.

Bu durumların ortak noktası, elle yönetilen bir Package.swift dosyasına dayanmaları — sadece bir uygulama projesine bağımlılık eklediğinde Xcode’un senin için yönettiği dosya değil. Uygulama veya proje birçok küçük modüle bölünmüş durumda ve karşılık gelen bir .xcodeproj dosyası yok, Xcode doğrudan Package.swift dosyasını açar, projeye ihtiyaç duymadan.

Bu aynı zamanda, ayrı modüller için Xcode’da herhangi bir build ayarı veya build script’i belirtmenin bir yolu olmadığı, her şeyin doğrudan Package.swift manifest dosyasında yapılması gerektiği anlamına geliyor.

SwiftPM’e gelecek sürümlerde bu tür özellikler ekleniyor olsa da (SE-303, SE-325, SE-332), .xcconfig dosyaları gibi Xcode’a özgü özellikleri destekleyeceklerine dair bir işaret yok.

Gizli anahtarlarımızı Git’e commit etmekten nasıl saklayabiliriz ki Git sağlayıcımıza veya repo’muza erişimi olan herkese sızdırmayalım — bugün?

SwiftPM resources ve JSONDecoder

Bunun tek bir “en iyi” cevabı olmadığından eminim ve başkalarının benden daha akıllıca fikirleri olabilir. Ama işleri basit tutmayı seviyorum ve temel özellikleri kullanmayı tercih ediyorum çünkü onları iyi biliyorum, diğer geliştiricilerin gerektiğinde hızlıca anlayacağını bekliyorum ve geleceğe dayanıklı olduklarından emin olabiliyorum.

Kullanmak istediğim yaklaşım, web geliştirmede yaygın olan klasik .env dosyası yaklaşımı. Ama özel formatlı bir .env dosyası yerine, gizli anahtarlarımın bulunduğu basit bir .json dosyası istiyorum, çünkü JSON dosyaları birçok iOS geliştiricisi için tanıdık ve Swift’te JSONDecoder sayesinde bunları parse etmek için yerleşik destek var. Dosya veya daha genel olarak “kaynak” yükleme de Swift 5.3’ten beri SwiftPM tarafından destekleniyor (SE-271).

İşte gizli anahtarları Git’ten saklamak istediğim temel fikrin ana hatları:

  1. Anahtarları içeren ama değerleri olmayan bir secrets.json.sample dosyasını Git’e commit et

  2. Geliştiricilerin bunu kopyalayıp .sample uzantısını kaldırması ve değerleri eklemesi

  3. secrets.json dosyasını .gitignore ile yoksayarak asla commit edilmemesini sağla

  4. Gizli anahtarları okumak için Decodable’a uygun basit bir struct sağla

Bu yazının geri kalanı bu yaklaşımın nasıl uygulanacağına dair adım adım bir rehber. Örnek olarak, iki üçüncü parti çeviri servisiyle entegre olan açık kaynak çeviri aracım BartyCrouch’un birim testlerini kullanacağım.

⚠️ Bu yaklaşımı kullanıcılara göndereceğin bir uygulama target’ına uygulamayı planlıyorsan, bu NSHipster makalesindeki .xcconfig yaklaşımında anlatılan aynı sorunla karşılaşma ihtimalin var. Benim yöntemim sadece gizli anahtarları Git’ten saklamaya yardımcı olur, kullanıcılara göndermeyi planlıyorsan ek obfuscation’a ihtiyacın olacak.

secrets.json kaynak dosyasını ekleme

Önce projemize secrets.json dosyasını ekleyelim. Karşılık gelen bir secrets.json.sample ve bir Secrets.swift dosyası olacağı için, önce Secrets adında bir klasör oluşturmayı, sonra secrets.json adında boş bir dosya oluşturmayı ve iki anahtarlı basit bir JSON sözlük yapısı eklemeyi tercih ediyorum:

The <code>secrets.json</code> file with two actual secrets, added to the project.

Böylece CI’ım da gizli anahtarlarıma sızdırmadan güvenli bir şekilde erişecek şekilde kurulmuş oluyor.

Bu yazıyı beğendin mi? Swift ipuçları ve indie geliştirici güncellemeleri için Bluesky ve Mastodon üzerinden takip et.