Geocoding API:取得API 金鑰| Google 地圖平台付費方案

文章推薦指數: 80 %
投票人數:10人

Google Maps API 網路服務會拒絕同時使用用戶端ID 與API 金鑰送出的要求。

產生數位簽章. Google 地圖平台付費方案客戶向Geocoding API 送出要求時,必須 ... Google 地圖平台 總覽 產品 定價 說明文件 開始使用 開始使用Google地圖平台 API挑選器 計費和定價方式 報表與監控 地圖ID 常見問題 支援與資源 事件管理 地圖介面集 MapsJavaScriptAPI MapsSDKforAndroid MapsSDKforiOS MapsStaticAPI StreetViewStaticAPI MapsEmbedAPI 地圖網址 MapsElevationAPI 路徑介面集 DirectionsAPI DistanceMatrixAPI RoadsAPI 解決方案 產業解決方案 遊戲服務 運輸與物流 地點介面集 PlacesAPI PlacesSDKforAndroid PlacesSDKforiOS PlacesLibrary、MapsJavaScriptAPI GeocodingAPI GeolocationAPI TimeZoneAPI 其他資源 API安全性最佳做法 地圖涵蓋範圍詳細資料 最佳化指南 行動作業系統和軟體支援 推出階段 淘汰項目 資產追蹤方案 網址編碼 WordPress使用者 網誌 社群 StackOverflow GitHub YouTube Discord Twitter IssueTracker English BahasaIndonesia Deutsch Español Español–AméricaLatina Français Português–Brasil Русский 中文–简体 中文–繁體 日本語 한국어 登入 付費方案 Google 地圖平台 總覽 產品 定價 說明文件 更多 網誌 社群 更多 開始使用 開始使用Google地圖平台 API挑選器 計費和定價方式 報表與監控 地圖ID 常見問題 支援與資源 事件管理 地圖介面集 MapsJavaScriptAPI MapsSDKforAndroid MapsSDKforiOS MapsStaticAPI StreetViewStaticAPI MapsEmbedAPI 地圖網址 MapsElevationAPI 路徑介面集 DirectionsAPI DistanceMatrixAPI RoadsAPI 解決方案 產業解決方案 遊戲服務 運輸與物流 地點介面集 PlacesAPI PlacesSDKforAndroid PlacesSDKforiOS PlacesLibrary、MapsJavaScriptAPI GeocodingAPI GeolocationAPI TimeZoneAPI 其他資源 API安全性最佳做法 地圖涵蓋範圍詳細資料 最佳化指南 行動作業系統和軟體支援 推出階段 淘汰項目 資產追蹤方案 網址編碼 WordPress使用者 StackOverflow GitHub YouTube Discord Twitter IssueTracker 首頁 產品 Google地圖平台 付費方案 GeocodingAPI:取得API金鑰 透過集合功能整理內容 你可以依據偏好儲存及分類內容。

注意事項:Google地圖平台付費方案不再開放註冊或提供給新客戶。

選擇驗證方法 如要使用Google地圖平台,您必須使用API金鑰或是用戶端ID,搭配數位簽章來驗證要求。

可選用的驗證方法取決於您的授權類型: 採用付費方案的客戶可以使用API金鑰或是用戶端ID搭配數位簽章。

使用舊版授權的客戶則必須使用用戶端ID與數位簽章進行驗證。

在判斷要採用哪種驗證方法時,您可以考量下列這幾點: 使用API金鑰進行驗證(付費方案) 如果使用API金鑰來驗證要求,您可以: 在GoogleCloudConsole的「API」頁面管理所有的API。

在CloudConsole的「API」頁面查看即時使用資料和30天的歷來使用資料。

將channel參數加進要求中,以便查看更詳細的使用情況報表。

透過GoogleCloudConsole查看內含超過30天資料的使用情況報表。

使用用戶端ID和數位簽章進行驗證(付費方案或舊版授權)如果使用用戶端ID和數位簽章來驗證要求,您可以: 將channel參數加進要求中,以便查看更詳細的使用情況報表。

透過CloudConsole查看內含超過30天資料的使用情況報表。

使用MapsJavaScriptAPI適用的地圖Analytics(分析)工具。

進一步瞭解付費方案客戶可用的報表。

使用API金鑰進行驗證 注意事項:此做法僅限付費方案客戶使用。

取得API金鑰 API金鑰是一組專屬ID,用來驗證與專案相關的使用權限與帳單處理要求。

取得API金鑰的方法如下: 在CloudConsole的專案選取器頁面中,選取或建立您想新增API金鑰的GoogleCloud專案。

前往專案選取器頁面 注意事項:如要使用方案的完整功能,付費客戶應使用與付費帳戶連結的專案。

購買授權後,您會收到以下列格式編寫的付費資產名稱:gme-[company]>proj-[number]([type])。

為確保您存取的是正確的專案,請透過console.cloud.google.com/project/number(將number替換成專案編號)以「專案擁有者身分」登入CloudConsole。

您可以在歡迎信中查看專案擁有者是誰。

前往「Google地圖平台」>「憑證」頁面。

前往「憑證」頁面 在「憑證」頁面上,按一下[建立憑證]>[API金鑰]。

「建立的API金鑰」對話方塊會顯示您新建立的API金鑰。

按一下[關閉]。

新建立的API金鑰便會出現在「憑證」頁面的「API金鑰」下方。

(在實際工作環境中使用新建立的金鑰前,記得要先限制API金鑰。

) 將API金鑰加進要求中 每個Google地圖平台要求都必須包含API金鑰。

請將以下範例中的YOUR_API_KEY替換成您的API金鑰。

https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=YOUR_API_KEY 使用API金鑰的要求必須透過HTTPS傳送,而對於使用用戶端ID的要求,則不強制但建議採用HTTPS。

此外,應用程式要求如果含有敏感的使用者資料(如使用者所在位置),也必須採用HTTPS。

限制API金鑰 限制API金鑰可確保只有經授權的要求才能使用API金鑰,進而提升您應用程式的安全性。

我們極力建議您按照操作說明設定API金鑰的限制。

詳情請參閱API安全性最佳做法。

限制API金鑰的方法如下: 前往「Google地圖平台」>「憑證」頁面。

前往「憑證」頁面 選取您要設定限制的API金鑰。

畫面隨即顯示API金鑰屬性頁面。

在「金鑰限制」下方,設定下列限制: 應用程式限制: 如要接受來自您提供的清單中網路伺服器IP位址提出的要求,請從「應用程式限制」清單中選取[IP位址(網路伺服器和Cron工作等)]。

指定一個IPv4或IPv6位址,或是採用CIDR標記法的子網路(例如192.168.0.0/22)。

如果您還需要輸入其他項目,系統會在您新增上述項目後顯示新的對話方塊。

API限制: 按一下[限制金鑰]。

從「選取API」下拉式選單中選取[Google地圖平台]。

如果選單未列出Google地圖平台,您必須先加以啟用。

如要完成變更,請按一下[儲存]。

使用用戶端ID搭配數位簽章進行驗證 注意事項:採用付費方案或舊版授權的客戶皆可使用此作法。

購買Google地圖平台付費方案授權後,您會收到Google寄送的歡迎電子郵件,內含您的用戶端ID及私人加密編譯金鑰(可用來產生您專屬的數位簽章)。

您必須將用戶端ID與專屬數位簽章傳遞給以下程式碼範例中的client和signature參數。

https://maps.googleapis.com/maps/api/geocode/json ?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA &client=YOUR_CLIENT_ID &signature=SIGNATURE 將YOUR_CLIENT_ID替換成歡迎電子郵件中隨附的用戶端ID。

您的用戶端ID會以gme-字元開頭。

將SIGNATURE替換成您專屬的數位簽章(請參閱產生數位簽章)。

注意事項: 使用用戶端ID搭配數位簽章驗證Google地圖平台時,您也可以選擇使用channel參數接收詳細的使用報表。

詳情請參閱付費方案報表簡介。

如果您原先使用API金鑰進行驗證,但現在要改用用戶端ID,必須將要求中的key參數移除。

GoogleMapsAPI網路服務會拒絕同時使用用戶端ID與API金鑰送出的要求。

產生數位簽章 Google地圖平台付費方案客戶向GeocodingAPI送出要求時,必須提供數位signature。

透過歡迎電子郵件中隨附的私人加密編譯金鑰即可產生這個簽章(詳情請見「進一步瞭解私人加密編譯金鑰」一節的說明)。

請按照下列步驟為您的要求產生數位簽章。

建立不含簽章的要求網址,並務必加上client參數。

請注意,所有非標準字元都需要經過網址編碼處理: https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&client=clientID 注意事項:所有Google服務都要求採用UTF-8字元編碼(也就是以隱含方式納入ASCII)。

如果您的應用程式運作時會使用其他字元集,請確認網址是以UTF-8字元建立,且經過妥善的網址編碼處理。

去除要求中的網域部分,只留下路徑及查詢: /maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&client=clientID 擷取您的私密金鑰(該金鑰是以網址適用的修改版Base64進行編碼),並使用HMAC-SHA1演算法簽署前個步驟產生的網址。

您可能需要將此金鑰解碼為原始的二進位格式。

請注意,在大部分的加密編譯程式庫中,最終的簽章是採用二進位格式。

注意事項:修改版Base64網址編碼會將標準Base64編碼的+及/字元分別替換成-和_,因此這類Base64簽章不需要再進行網址編碼處理。

使用網址適用的修改版Base64為產生的二進位簽章進行編碼,將此簽章轉換為可在網址內傳送的物件。

將此簽章附加至網址(置於signature參數內): https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&client=clientID&signature=base64signature 注意事項: 我們的伺服器會藉由專屬簽章,驗證是否所有使用您用戶端ID產生要求的網站都已獲得授權。

此外,每個網址也都有專屬簽章,確保只有在已要求產生新簽章的情況下,才能修改使用您用戶端ID的要求。

如果嘗試以無效的簽章存取GeocodingAPI,就會發生HTTP403(禁止)錯誤。

如要讓應用程式改用網址簽署,請務必先進行測試,確保簽章可發出有效的要求。

請先測試原始網址是否有效,以及是否可以產生正確的簽章。

如需使用伺服器端程式碼導入網址簽署的做法範例,請參閱「網址簽署的程式碼範例」。

如要立即簽署網址,請在下方輸入網址和網址簽署密鑰。

網址必須採用前文步驟1所述的格式,並且經過網址編碼處理。

網址簽署程式碼範例 後續章節會說明使用伺服器端程式碼導入網址簽署的方式。

網址應一律在伺服器端簽署,以避免向其他使用者暴露您的加密編譯金鑰。

Python 以下範例使用標準Python程式庫簽署網址(下載程式碼)。

#!/usr/bin/python #-*-coding:utf-8-*- """SignsaURLusingaURLsigningsecret""" importhashlib importhmac importbase64 importurllib.parseasurlparse defsign_url(input_url=None,secret=None): """SignarequestURLwithaURLsigningsecret. Usage: fromurlsignerimportsign_url signed_url=sign_url(input_url=my_url,secret=SECRET) Args: input_url-TheURLtosign secret-YourURLsigningsecret Returns: ThesignedrequestURL """ ifnotinput_urlornotsecret: raiseException("Bothinput_urlandsecretarerequired") url=urlparse.urlparse(input_url) #Weonlyneedtosignthepath+querypartofthestring url_to_sign=url.path+"?"+url.query #Decodetheprivatekeyintoitsbinaryformat #WeneedtodecodetheURL-encodedprivatekey decoded_key=base64.urlsafe_b64decode(secret) #CreateasignatureusingtheprivatekeyandtheURL-encoded #stringusingHMACSHA1.Thissignaturewillbebinary. signature=hmac.new(decoded_key,str.encode(url_to_sign),hashlib.sha1) #Encodethebinarysignatureintobase64forusewithinaURL encoded_signature=base64.urlsafe_b64encode(signature.digest()) original_url=url.scheme+"://"+url.netloc+url.path+"?"+url.query #ReturnsignedURL returnoriginal_url+"&signature="+encoded_signature.decode() if__name__=="__main__": input_url=input("URLtoSign:") secret=input("URLsigningsecret:") print("SignedURL:"+sign_url(input_url,secret)) Java 以下範例使用JDK1.8以上版本提供的java.util.Base64類別;如果您使用較舊版本,建議使用ApacheCommons或類似程式碼(下載程式碼)。

importjava.io.IOException; importjava.io.UnsupportedEncodingException; importjava.net.URI; importjava.net.URISyntaxException; importjava.security.InvalidKeyException; importjava.security.NoSuchAlgorithmException; importjava.util.Base64;//JDK1.8only-olderversionsmayneedtouseApacheCommonsorsimilar. importjavax.crypto.Mac; importjavax.crypto.spec.SecretKeySpec; importjava.net.URL; importjava.io.BufferedReader; importjava.io.InputStreamReader; publicclassUrlSigner{ //Note:Generally,youshouldstoreyourprivatekeysomeplacesafe //andreadthemintoyourcode privatestaticStringkeyString="YOUR_PRIVATE_KEY"; //TheURLshownintheseexamplesisastaticURLwhichshouldalready //beURL-encoded.Inpractice,youwilllikelyhavecode //whichassemblesyourURLfromuserorwebserviceinput //andplugsthosevaluesintoitsparameters. privatestaticStringurlString="YOUR_URL_TO_SIGN"; //Thisvariablestoresthebinarykey,whichiscomputedfromthestring(Base64)key privatestaticbyte[]key; publicstaticvoidmain(String[]args)throwsIOException, InvalidKeyException,NoSuchAlgorithmException,URISyntaxException{ BufferedReaderinput=newBufferedReader(newInputStreamReader(System.in)); StringinputUrl,inputKey=null; //Fortestingpurposes,allowuserinputfortheURL. //Ifnoinputisentered,usethestaticURLdefinedabove. System.out.println("EntertheURL(mustbeURL-encoded)tosign:"); inputUrl=input.readLine(); if(inputUrl.equals("")){ inputUrl=urlString; } //ConvertthestringtoaURLsowecanparseit URLurl=newURL(inputUrl); //Fortestingpurposes,allowuserinputfortheprivatekey. //Ifnoinputisentered,usethestatickeydefinedabove. System.out.println("EnterthePrivatekeytosigntheURL:"); inputKey=input.readLine(); if(inputKey.equals("")){ inputKey=keyString; } UrlSignersigner=newUrlSigner(inputKey); Stringrequest=signer.signRequest(url.getPath(),url.getQuery()); System.out.println("SignedURL:"+url.getProtocol()+"://"+url.getHost()+request); } publicUrlSigner(StringkeyString)throwsIOException{ //Convertthekeyfrom'websafe'base64tobinary keyString=keyString.replace('-','+'); keyString=keyString.replace('_','/'); System.out.println("Key:"+keyString); //Base64isJDK1.8only-olderversionsmayneedtouseApacheCommonsorsimilar. this.key=Base64.getDecoder().decode(keyString); } publicStringsignRequest(Stringpath,Stringquery)throwsNoSuchAlgorithmException, InvalidKeyException,UnsupportedEncodingException,URISyntaxException{ //RetrievetheproperURLcomponentstosign Stringresource=path+'?'+query; //GetanHMAC-SHA1signingkeyfromtherawkeybytes SecretKeySpecsha1Key=newSecretKeySpec(key,"HmacSHA1"); //GetanHMAC-SHA1MacinstanceandinitializeitwiththeHMAC-SHA1key Macmac=Mac.getInstance("HmacSHA1"); mac.init(sha1Key); //computethebinarysignaturefortherequest byte[]sigBytes=mac.doFinal(resource.getBytes()); //base64encodethebinarysignature //Base64isJDK1.8only-olderversionsmayneedtouseApacheCommonsorsimilar. Stringsignature=Base64.getEncoder().encodeToString(sigBytes); //convertthesignatureto'websafe'base64 signature=signature.replace('+','-'); signature=signature.replace('/','_'); returnresource+"&signature="+signature; } } NodeJS 以下範例使用原生Node模組簽署網址(下載程式碼)。

'usestrict' constcrypto=require('crypto'); consturl=require('url'); /** *Convertfrom'websafe'base64totruebase64. * *@param{string}safeEncodedStringThecodeyouwanttotranslate *fromawebsafeform. *@return{string} */ functionremoveWebSafe(safeEncodedString){ returnsafeEncodedString.replace(/-/g,'+').replace(/_/g,'/'); } /** *Convertfromtruebase64to'websafe'base64 * *@param{string}encodedStringThecodeyouwanttotranslatetoa *websafeform. *@return{string} */ functionmakeWebSafe(encodedString){ returnencodedString.replace(/\+/g,'-').replace(/\//g,'_'); } /** *Takesabase64codeanddecodesit. * *@param{string}codeTheencodeddata. *@return{string} */ functiondecodeBase64Hash(code){ //"newBuffer(...)"isdeprecated.UseBuffer.fromifitexists. returnBuffer.from?Buffer.from(code,'base64'):newBuffer(code,'base64'); } /** *Takesakeyandsignsthedatawithit. * *@param{string}keyYouruniquesecretkey. *@param{string}dataTheurltosign. *@return{string} */ functionencodeBase64Hash(key,data){ returncrypto.createHmac('sha1',key).update(data).digest('base64'); } /** *SignaURLusingasecretkey. * *@param{string}pathTheurlyouwanttosign. *@param{string}secretYouruniquesecretkey. *@return{string} */ functionsign(path,secret){ consturi=url.parse(path); constsafeSecret=decodeBase64Hash(removeWebSafe(secret)); consthashedSignature=makeWebSafe(encodeBase64Hash(safeSecret,uri.path)); returnurl.format(uri)+'&signature='+hashedSignature; } C# 以下範例使用預設的System.Security.Cryptography程式庫簽署網址要求。

請注意,我們必須轉換預設的Base64編碼,才能導入安全網址版本(下載程式碼)。

usingSystem; usingSystem.Collections.Generic; usingSystem.Security.Cryptography; usingSystem.Text; usingSystem.Text.RegularExpressions; usingSystem.Web; namespaceSignUrl{ publicstructGoogleSignedUrl{ publicstaticstringSign(stringurl,stringkeyString){ ASCIIEncodingencoding=newASCIIEncoding(); //convertingkeytobyteswillthrowanexception,needtoreplace'-'and'_'charactersfirst. stringusablePrivateKey=keyString.Replace("-","+").Replace("_","/"); byte[]privateKeyBytes=Convert.FromBase64String(usablePrivateKey); Uriuri=newUri(url); byte[]encodedPathAndQueryBytes=encoding.GetBytes(uri.LocalPath+uri.Query); //computethehash HMACSHA1algorithm=newHMACSHA1(privateKeyBytes); byte[]hash=algorithm.ComputeHash(encodedPathAndQueryBytes); //convertthebytestostringandmakeurl-safebyreplacing'+'and'/'characters stringsignature=Convert.ToBase64String(hash).Replace("+","-").Replace("/","_"); //AddthesignaturetotheexistingURI. returnuri.Scheme+"://"+uri.Host+uri.LocalPath+uri.Query+"&signature="+signature; } } classProgram{ staticvoidMain(){ //Note:Generally,youshouldstoreyourprivatekeysomeplacesafe //andreadthemintoyourcode conststringkeyString="YOUR_PRIVATE_KEY"; //TheURLshownintheseexamplesisastaticURLwhichshouldalready //beURL-encoded.Inpractice,youwilllikelyhavecode //whichassemblesyourURLfromuserorwebserviceinput //andplugsthosevaluesintoitsparameters. conststringurlString="YOUR_URL_TO_SIGN"; stringinputUrl=null; stringinputKey=null; Console.WriteLine("EntertheURL(mustbeURL-encoded)tosign:"); inputUrl=Console.ReadLine(); if(inputUrl.Length==0){ inputUrl=urlString; } Console.WriteLine("EnterthePrivatekeytosigntheURL:"); inputKey=Console.ReadLine(); if(inputKey.Length==0){ inputKey=keyString; } Console.WriteLine(GoogleSignedUrl.Sign(inputUrl,inputKey)); } } } 針對測試部分,您可以試試看以下網址及私密金鑰能否產生正確的簽章。

請注意,這組私密金鑰僅供測試,實際上無法通過任何Google服務的驗證。

網址: https://maps.googleapis.com/maps/api/geocode/json?address=New+York&client=clientID 私密金鑰: vNIXE0xscrmjlyV-12Nj_BvUPaw= 要簽署的網址部分: /maps/api/geocode/json?address=New+York&client=clientID 簽章: chaRF2hTJKOScPr-RQCEhZbSzIE= 完整的已簽署網址: https://maps.googleapis.com/maps/api/geocode/json?address=New+York&client=clientID&signature=chaRF2hTJKOScPr-RQCEhZbSzIE= 其他程式語言範例 如需其他程式語言範例,請參閱網址簽署專案。

進一步瞭解私人加密編譯金鑰 系統會使用您的用戶端ID核發私人加密編譯網址簽署金鑰,該金鑰是您和Google之間的「共同密鑰」。

這組簽署金鑰為您獨有,且專屬於您的用戶端ID。

因此,請妥善保管簽署金鑰。

這組金鑰不得用於任何要求、儲存在任何網站上,或張貼到任何公開論壇;否則凡是能取得該簽署金鑰的使用者,都可以假冒您的身分提出要求。

注意事項:這組私人加密編譯簽署金鑰與GoogleCloudConsole核發的API金鑰「不」一樣。

如果您遺失了私人加密編譯金鑰,請登入CloudConsole,然後按一下[地圖:管理用戶端ID]以擷取該金鑰。

注意事項:在您的付費方案授權到期後,CloudConsole的「憑證」頁面將不再顯示「用戶端ID」部分。

排解驗證相關問題 如果要求格式錯誤或提供的簽章無效,Google地圖平台會傳回HTTP403(Forbidden)錯誤。

如要排解個別網址的問題,您可以使用網址簽署偵錯工具。

此工具可以讓您快速驗證網址和應用程式產生的簽章。

除了上述方法外,付費方案客戶也可以登入CloudConsole,然後選取[資源]>[Google地圖平台付費方案線上工具]>[網路服務和ImageAPI的網址簽署偵錯工具],接著解決個別網址的問題。

Exceptasotherwisenoted,thecontentofthispageislicensedundertheCreativeCommonsAttribution4.0License,andcodesamplesarelicensedundertheApache2.0License.Fordetails,seetheGoogleDevelopersSitePolicies.JavaisaregisteredtrademarkofOracleand/oritsaffiliates. Lastupdated2021-08-25UTC. [{ "type":"thumb-down", "id":"missingTheInformationINeed", "label":"缺少我需要的資訊" },{ "type":"thumb-down", "id":"tooComplicatedTooManySteps", "label":"過於複雜/步驟過多" },{ "type":"thumb-down", "id":"outOfDate", "label":"過時" },{ "type":"thumb-down", "id":"translationIssue", "label":"翻譯問題" },{ "type":"thumb-down", "id":"samplesCodeIssue", "label":"示例/程式碼問題" },{ "type":"thumb-down", "id":"otherDown", "label":"其他" }] [{ "type":"thumb-up", "id":"easyToUnderstand", "label":"容易理解" },{ "type":"thumb-up", "id":"solvedMyProblem", "label":"確實解決了我的問題" },{ "type":"thumb-up", "id":"otherUp", "label":"其他" }] StackOverflow 使用google-maps標記提出問題。

GitHub 運用現有樣本進行設計。

Discord 與其他開發人員交流,瞭解Google地圖平台。

IssueTracker 如果發生錯誤,請傳送錯誤報告給我們! 瞭解詳情 教學課程 定價與方案 API挑選器 MapsAPI總覽 平台 Android iOS 網路 網路服務 產品資訊 聯絡銷售人員 社群支援 付費支援 使用條款 Android Chrome Firebase GoogleCloudPlatform 所有產品 條款 隱私權 訂閱GoogleDevelopers電子報 訂閱 English BahasaIndonesia Deutsch Español Español–AméricaLatina Français Português–Brasil Русский 中文–简体 中文–繁體 日本語 한국어



請為這篇文章評分?