ایمن سازی کلیدهای API در پروژه های اندروید

در دنیای امروزی فناوری، استفاده از رابط‌های برنامه‌نویسی (API) برای ارتباط بین برنامه‌ها و سرویس‌ها امری بسیار رایج و ضروری است. با افزایش استفاده از تکنولوژی‌های مبتنی بر ابر و اینترنت اشیاء، اهمیت ایمنی و امنیت اطلاعاتی در ارتباطات بین برنامه‌ها افزایش یافته است. در این راستا، محافظت از کلیدهای API و اطمینان از ایمنی آنها در پروژه‌های اندروید از اهمیت ویژه‌ای برخوردار است.

در این مقاله، به بررسی ایمن‌سازی کلیدهای API در پروژه‌های اندروید می‌پردازیم.


اکثر منابع آنلاین به شما می گویند که کلیدهای حساس را روی gradle.properties یا local.properties موجود قرار دهید، اما راه پیشنهادی این است که فایل properties. خود را ایجاد کنید.

برای شروع، Jetbrains به ما می گوید که ویرایش local.properties غیرممکن است زیرا تغییرات پاک می‌شوند.

نکته: فایل local.properties برای ویژگی های مخصوص افزونه Android Gradle محفوظ است. قرار دادن مقادیر خودتان در این فایل می تواند مشکلاتی ایجاد کند.

از طرف دیگر فایل gradle.properties برای ویژگی های Gradle در سطح پروژه محفوظ است و ممکن است در کنار کد منبع پروژه شما در کنترل نسخه بررسی شود.

فایل gradle.properties برای تنظیمات gradle در کل پروژه است و برای اطلاعات حساس مانند کلیدهای API توصیه نمی شود، به خصوص اگر قصد دارید پروژه خود را به اشتراک بگذارید یا در یک تیم کار کنید.

راه حل این است که فایل های properties. خود را همانطور که در زیر توضیح داده شده است ایجاد کنید:


مرحله 1: در دایرکتوری root پروژه خود فایل apikeys.properties را ایجاد کنید (تا زمانی که پسوند فایل properties. داشته باشد می توانید از نام فایل دلخواه خود استفاده کنید) و کلید API خود را اضافه کنید:

این کار را در حالی که در view پروژه (نه در view های اندروید) هستید انجام دهید تا بتوانید فایل جدید ایجاد شده را پیدا کنید.

مرحله 2: فایل properties. ایجاد شده را به فایل gitignore. اضافه کنید تا از ردیابی و اشتراک گذاری آن در GitHub جلوگیری کنید، اطلاعات موجود در فایل در تنظیمات محلی شما باقی می ماند.

مرحله 3: در داخل فایل build.gradle.kts (به عنوان مثال در داخل بلوک Android تحت تنظیمات پیش فرض) می توانید ویژگی های کلید-مقدار را از فایل properties. بارگیری کنید و به صورت زیر به آنها دسترسی داشته باشید:

این کد Kotlin DSL کلید API را از فایل properties. بارگیری می کند و آن را به عنوان ثابت BuildConfig class برای هر دو نسخه release و debug اضافه می کند.

کلاس BuildConfig به طور خودکار توسط پلاگین Gradle در طول فرآیند ساخت تولید می شود. این شامل ثابت ها و پرچم های مختلفی است که در کد اندروید شما قابل دسترسی است.

مرحله 4: با تعریف کردن تابع ()buildConfigField این امکان برای ما فراهم می شود که فیلدهای سفارشی را در کلاس BuildConfig تعریف کنیم.

buildConfigField() برای تزریق مقادیر پیکربندی مانند کلیدهای API مفید است.

این سه آرگومان های تعریف شده به شرح زیر است:

  • آرگومان type - در مورد String است.
  • آرگومان Name که در فایل .properties. مشخص شده است.
  • آرگومان Value - که کلید API بارگیری شده ما است.

به یاد داشته باشید که برای اعمال تغییرات و ایجاد کلاس BuildConfig در مرحله آخر نیاز دارید پروژه را همگام سازی کنید.

مرحله 5: به مقادیر ثابت های (constant) BuildConfig class در کد منبع اصلی خود دسترسی پیدا کنید:

همچنین BuildConfig.API_KEY به مقادیر ثابت API_KEY تعریف‌شده در فایل BuildConfig که به‌طور خودکار تولید می‌شود دسترسی پیدا می‌کند - این شامل ثابت‌های(constants) مختلفی است که در پیکربندی ساخت پروژه در کنار فیلدهای سفارشی ما تعریف شده‌اند.

به این ترتیب، هنگامی که کد خود را push می کنید، فایل properties. که حاوی اطلاعات طبقه بندی شده شما است، نمایش داده نمی شود. با این حال، شما همچنان به کلیدهای api دسترسی خواهید داشت و برنامه خود را به صورت محلی اجرا می کنید.


کلیدهای Abstract از فایل Manifest

پس از انجام کدهای خود، فایل مانیفست اندروید همراه با فایل‌های دیگر push می‌شود. برای جلوگیری از قرار گرفتن در معرض دید، ضروری است که کلیدهای حساس را از فایل مانیفست به فایل properties. انتزاع کنید.

ما همان مراحلی را که در بخش اول در بالا ذکر شد دنبال می کنیم تا کلید Google Maps را از Manifest به فایل properties. منتقل کنیم.

با ایجاد فایل mapskey.properties شروع کنید و آن را به فایل gitignore. اضافه کنید. کلید نقشه های گوگل را روی فایل مانیفست بدون دو نقل قول بنویسید.

کلید را در فایل mapskey.properties با MAPS_API_KEY به عنوان کلید قرار دهید.

این خطوط کد را در فایل build.gradle.kts خود قرار دهید.

این کد کلید Google maps را از فایل properties. بارگیری می کند و به صورت پویا آن را با استفاده از متغیرهای سیستم ساخت به فایل مانیفست تزریق می کند.

همچنین manifestPlaceholdersis یک (mutable map) <MutableMap <String, Any> و مکانیزمی است که توسط سیستم ساخت Gradle برای تزریق مقادیر به مانیفست در طول فرآیند ساخت استفاده می شود.

تغییرات زیر را در فایل manifest.xml خود اعمال کنید تا رشته کدگذاری شده را با متغیر GOOGLE_KEY جایگزین کنید.

در طی فرآیند ساخت، Gradle مکان‌نما (placeholder) را در فایل AndroidManifest.xml با مقادیر مربوطه از mutable map manifestPlaceholders جایگزین می‌کند.

با پیروی از این رویکرد، کلید maps در فایل .properties. مبهم باقی می ماند و به صورت پویا به فایل مانیفست بدون افشای آن در مخازن (repository) عمومی تزریق می شود.

بخش بعدی کل چرخه فرآیند را به پایان می رساند.


گنجاندن فایل های Properties در GitHub Secrets

Secrets داده ها یا متغیرهای رمزگذاری شده ای هستند که در مخزن GitHub ذخیره می شوند.

ما از GitHub Secrets برای ذخیره اطلاعات حساس مانند کلیدهای API، اعتبارنامه‌ها یا کلیدهای نقشه‌های Google استفاده می‌کنیم که نمی‌خواهیم به صورت عمومی در مخازن GitHub افشا شوند.

در این مورد ما می‌توانیم محتویات فایل properties. موجود در محلی را که حاوی اطلاعات حساس در GitHub Secret است ذخیره کنیم تا عملیات CI/CD را تسهیل کنیم.

به مخزن GitHub خود بروید و روی تب تنظیمات کلیک کنید. در پنل سمت چپ Secrets و را پیدا کنید:

Variables > Actions > New Repository Secret

در فرم بعدی، نام مخفی را ترجیحا با حروف بزرگ وارد کنید و سپس محتویات فایل property. خود را در فضای مخفی کپی کنید. آن را با فشار دادن دکمه Add Secret برای ذخیره راز به پایان برسانید.

برای بارگیری secret ذخیره شده در محیط GitHub Actions، این خط را در YAML workflow خود وارد کنید، کد خود را commit و push کنید.

این مرحله workflow برای ما secret را واکشی می کند و آن را به عنوان یک فایل properties. در ماشین مجازی GitHub Action ذخیره می کند و آن را در معرض پردازش های Gradle قرار می دهد.



ممنون که تا آخر این پست همراه من بودید ، امیدوارم براتون مفید بوده باشه 🙌🙏✌ (:

بقیه آموزش های mister developer را می توانید در تلگرام و اینستاگرام دنبال کنید!!

کانال تلگرام: mister_developerr

اینستاگرام: mister_developerr

موفق و پیروز باشید