如同昨天的文章中所提到的,單一一個金鑰 (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}" />
以上就是今天的內容。
分別從後台端與應用程式端來限制與保護金鑰。
個人認為只要後台有做好金鑰限制與費用控管,應用程式端是否要將金鑰從版本控制中剔除,可以視團隊性質而定。
最後,謝謝耐心閱讀到此的各位,我們明天見囉~ ![]()