如同昨天的文章中所提到的,單一一個金鑰 (API Key) 就可以使用多種 Google Maps 的服務,如果沒有善加保管,遭到盜用可是會造成金錢上的損失。
因此,今天要和大家分享常見的保護措施,也是官方建議的保護措施。
要保護 API Key 不被惡意盜用,最簡單的方式就是從源頭下手,也就是我們最初取得 API Key 的後台。
打開 Google Cloud 的專案後台,進到 Google 地圖平台頁中的金鑰和憑證頁面。
沒有意外的話,應該會看到我們昨天所申請的金鑰,而上方的限制欄位寫著無。這代表目前我們的 API 沒有任何限制,只要有人拿到這支 Key ,他都可以隨意取用。
點選金鑰開啟金鑰限制頁面,可以看到應用程式限制的區塊有五種選項可選,
這幾個選項是取決於這個 API Key 的使用平台,而在我們的練習中,一定是選擇 Android 應用程式。
選擇後會發現下方多了可加入套件的區塊,這裡會需要填入
🚨 因為這裡認的簽署金鑰,是使用者實際取得的 APK 簽署金鑰。所以如果專案產製的 APK 有不同的 Sign key 簽署指紋,那幾種不同的指紋都要更新上來。
另外,如果是會公開發佈並交由 Google Play 簽署的 App,記得上架後要將二次簽署後的指紋一並更新上來。
signingreport
,並按下 Enter 執行。除了設定金鑰存取的應用程式外,我們還可以進一步的限制這把金鑰可以存取的服務。
因為目前這把 Key 只有要操作 Maps SDK for Android 這項服務,所以就把它設定成只能存取這個服務就好。
這樣的做法能讓我們能夠掌握每一把金鑰可以做的事情。
以我自己的經驗,專案中如果有區分 Web 前端、伺服器端、App 端(Android/iOS),通常會發行四把金鑰,讓各個服務平台各有自己的金鑰,並分別限制其能夠存取的 API 服物,以方便專案內的資源管理。
在昨天的範例裡,我們只是單純的把金鑰貼到 AndroidManifest.xml
裡。
這樣的做法看似沒問題,卻會讓金鑰加入到專案的 git 版控中,造成安全上的隱憂。
雖然實務上,大家應該都是習慣把它加到版控裡,畢竟這樣比較方便嘛...
不過,既然官方都提供了建議的最佳實作,我們還是遵照官方的做法來做一遍~
mapsplatform.secrets-gradle-plugin
相依套件build.gradle
中加入以下設定。// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
// 略...
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" apply false
}
如果你的 gradle file 是 groovy,可以參考以下。
plugins {
// ...
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1' apply false
}
build.gradle
中加入以下Kotlin 版本:
plugins {
// ...
id ("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
}
groovy 版本:
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
前面兩個設定都填完後,可以 sync 一下專案,確認有沒有問題。
接著開啟專案內的 local.property
,並在檔案內加入以下
MAP_API_KEY=專案金鑰
等號後面請貼上你專案的金鑰。
AndroidManifest.xml
將原本的金鑰改成以下<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="${MAPS_API_KEY}" />
以上就是今天的內容。
分別從後台端與應用程式端來限制與保護金鑰。
個人認為只要後台有做好金鑰限制與費用控管,應用程式端是否要將金鑰從版本控制中剔除,可以視團隊性質而定。
最後,謝謝耐心閱讀到此的各位,我們明天見囉~