iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
Mobile Development

Google Maps SDK for Android 與 GIS App 開發筆記系列 第 7

Day 7: Google Maps SDK for Android–官方建議的金鑰保護措施

  • 分享至 

  • xImage
  •  

如同昨天的文章中所提到的,單一一個金鑰 (API Key) 就可以使用多種 Google Maps 的服務,如果沒有善加保管,遭到盜用可是會造成金錢上的損失。/images/emoticon/emoticon16.gif

因此,今天要和大家分享常見的保護措施,也是官方建議的保護措施。

後台端限制

要保護 API Key 不被惡意盜用,最簡單的方式就是從源頭下手,也就是我們最初取得 API Key 的後台。

打開 Google Cloud 的專案後台,進到 Google 地圖平台頁中的金鑰和憑證頁面。

https://ithelp.ithome.com.tw/upload/images/20230921/20160271cD2fLyv3ns.png

沒有意外的話,應該會看到我們昨天所申請的金鑰,而上方的限制欄位寫著無。這代表目前我們的 API 沒有任何限制,只要有人拿到這支 Key ,他都可以隨意取用。

設定應用程式限制

https://ithelp.ithome.com.tw/upload/images/20230921/20160271fY37pveF41.png

點選金鑰開啟金鑰限制頁面,可以看到應用程式限制的區塊有五種選項可選,

  1. 網址
  2. IP 位址
  3. Android 應用程式
  4. iOS 應用程式

這幾個選項是取決於這個 API Key 的使用平台,而在我們的練習中,一定是選擇 Android 應用程式。

https://ithelp.ithome.com.tw/upload/images/20230921/20160271KUl9kviwvE.png

選擇後會發現下方多了可加入套件的區塊,這裡會需要填入

  1. 套件名稱:也就是專案的 package name。
  2. 指紋:這裡指的是 APK 簽署的金鑰指紋 (SHA-1/SHA-256)。

🚨 因為這裡認的簽署金鑰,是使用者實際取得的 APK 簽署金鑰。所以如果專案產製的 APK 有不同的 Sign key 簽署指紋,那幾種不同的指紋都要更新上來。
另外,如果是會公開發佈並交由 Google Play 簽署的 App,記得上架後要將二次簽署後的指紋一並更新上來。

Signing key 指紋 如何取得?

  1. 打開 Android Studio 中側邊的 Gradle
  2. 點選開啟的側邊欄內左邊數來第一個按鈕的 Execute Gradle Task 圖示。

https://ithelp.ithome.com.tw/upload/images/20230921/20160271Qwj0YezuTk.png

  1. 開啟 Run Anything 視窗後,輸入 signingreport,並按下 Enter 執行。

https://ithelp.ithome.com.tw/upload/images/20230921/20160271lxy04o71le.png

  1. 執行成功後,就會在執行結果中看到各個 Build variant 的 Signing key 指紋囉。

https://ithelp.ithome.com.tw/upload/images/20230921/20160271La0Rf3Pbdg.png

設定金鑰可存取的 API

除了設定金鑰存取的應用程式外,我們還可以進一步的限制這把金鑰可以存取的服務。

因為目前這把 Key 只有要操作 Maps SDK for Android 這項服務,所以就把它設定成只能存取這個服務就好。

https://ithelp.ithome.com.tw/upload/images/20230921/20160271twcaCxQUzo.png

這樣的做法能讓我們能夠掌握每一把金鑰可以做的事情。

以我自己的經驗,專案中如果有區分 Web 前端、伺服器端、App 端(Android/iOS),通常會發行四把金鑰,讓各個服務平台各有自己的金鑰,並分別限制其能夠存取的 API 服物,以方便專案內的資源管理。

App 端的設定

在昨天的範例裡,我們只是單純的把金鑰貼到 AndroidManifest.xml 裡。

這樣的做法看似沒問題,卻會讓金鑰加入到專案的 git 版控中,造成安全上的隱憂。

雖然實務上,大家應該都是習慣把它加到版控裡,畢竟這樣比較方便嘛...

不過,既然官方都提供了建議的最佳實作,我們還是遵照官方的做法來做一遍~

加入 mapsplatform.secrets-gradle-plugin 相依套件

  1. 在專案層級的 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
}
  1. 在 app 的 build.gradle 中加入以下

Kotlin 版本:

plugins {
    // ...
    id ("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
}

groovy 版本:

id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
  1. 前面兩個設定都填完後,可以 sync 一下專案,確認有沒有問題。

  2. 接著開啟專案內的 local.property,並在檔案內加入以下

MAP_API_KEY=專案金鑰

等號後面請貼上你專案的金鑰。

  1. 回到 AndroidManifest.xml 將原本的金鑰改成以下
<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="${MAPS_API_KEY}" />
  1. 重新執行一次專案,會發現一樣可以正常顯示地圖,這樣就代表成功囉。

小結

以上就是今天的內容。

分別從後台端與應用程式端來限制與保護金鑰。

個人認為只要後台有做好金鑰限制與費用控管,應用程式端是否要將金鑰從版本控制中剔除,可以視團隊性質而定。

最後,謝謝耐心閱讀到此的各位,我們明天見囉~ /images/emoticon/emoticon08.gif


上一篇
Day 6: Google Maps SDK for Android–金鑰申請
下一篇
Day 8: Google Maps SDK for Android–常見的地圖設定
系列文
Google Maps SDK for Android 與 GIS App 開發筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言