2015-07-23 7 views
5

मैं अपना Google अनुवाद एपीआई काम करने की कोशिश कर रहा हूं लेकिन वर्तमान में मुझे कोई रास्ता नहीं मिल रहा है। इस प्रकार मैंने Google डेवलपर कंसोल में चीजें सेट की हैं:
मैंने डीबीयूजी प्रमाणपत्रों के साथ अपना SHA1 फिंगरप्रिंट सेट किया है। और पैकेज का नाम - "bg.webmap.wordy" (जो वास्तविक नाम है)। जब मैं एक कॉल करने का प्रयास करता हूं तो JSON में "ipRefererBlocked" त्रुटि लौटा दी जाती है। लेकिन जब मैं फिंगरप्रिंट और पैकेज नाम हटा देता हूं, यह पूरी तरह से काम करता है, लेकिन फिर हर कोई इस कुंजी का उपयोग कर सकता है, इसलिए यह बहुत असुरक्षित है। तो मेरी समस्या प्रमाणीकरण के साथ है।
क्या एपीआई को कॉल करने पर मेरा ऐप स्वचालित रूप से इस फिंगरप्रिंट को भेज देगा? क्या मुझे इसे खुद भेजना चाहिए और कैसे? समस्या डीबग प्रमाणपत्र में हो सकती है?Google एंड्रॉइड SHA1 फिंगरप्रिंट और पैकेज को कैसे सत्यापित करता है?

+0

क्या आपको अपने प्रश्न का उत्तर मिला है, @BabbevDan? – marcv

+0

नहीं, मैंने इसे असुरक्षित तरीके से समाप्त कर दिया – BabbevDan

उत्तर

1

मेरे एप्लिकेशन स्वचालित रूप से इस फिंगरप्रिंट जब एपीआई कहा जाता है भेजेंगे?

नहीं!

मैं इसे अपने आप भेजने के लिए और कैसे करना चाहिए?

हाँ!

जब android ऐप के लिए अपनी API कुंजी प्रतिबंध सेट करते समय आप पैकेज का नाम और SHA-1 प्रमाणपत्र फ़िंगरप्रिंट निर्दिष्ट। इसलिए जब आप Google को अनुरोध भेजते हैं, तो आपको इन अनुरोधों को प्रत्येक अनुरोध के शीर्षलेख में जोड़ना होगा।

कैसे?

As answered here, आप अपने कोड से अपने पैकेज का नाम और SHA प्रमाणपत्र प्राप्त करना होगा, और फिर शीर्ष लेख का अनुरोध करने के जोड़ने।

प्राप्त करें SHA प्रमाण पत्र:

/** 
* Gets the SHA1 signature, hex encoded for inclusion with Google Cloud Platform API requests 
* 
* @param packageName Identifies the APK whose signature should be extracted. 
* @return a lowercase, hex-encoded 
*/ 
public static String getSignature(@NonNull PackageManager pm, @NonNull String packageName) { 
    try { 
     PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); 
     if (packageInfo == null 
       || packageInfo.signatures == null 
       || packageInfo.signatures.length == 0 
       || packageInfo.signatures[0] == null) { 
      return null; 
     } 
     return signatureDigest(packageInfo.signatures[0]); 
    } catch (PackageManager.NameNotFoundException e) { 
     return null; 
    } 
} 

private static String signatureDigest(Signature sig) { 
    byte[] signature = sig.toByteArray(); 
    try { 
     MessageDigest md = MessageDigest.getInstance("SHA1"); 
     byte[] digest = md.digest(signature); 
     return BaseEncoding.base16().lowerCase().encode(digest); 
    } catch (NoSuchAlgorithmException e) { 
     return null; 
    } 
} 

अनुरोध हेडर को जोड़ना:

java.net.URL url = new URL(REQUEST_URL); 
HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
try { 
    connection.setDoInput(true); 
    connection.setDoOutput(true); 

    connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
    connection.setRequestProperty("Accept", "application/json"); 

    // add package name to request header 
    String packageName = mActivity.getPackageName(); 
    connection.setRequestProperty("X-Android-Package", packageName); 
    // add SHA certificate to request header 
    String sig = getSignature(mActivity.getPackageManager(), packageName); 
    connection.setRequestProperty("X-Android-Cert", sig); 
    connection.setRequestMethod("POST"); 

    // ADD YOUR REQUEST BODY HERE 
    // .................... 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    connection.disconnect(); 
} 

पूर्ण जवाब here देख सकते हैं।

कोडिंग का आनंद लें :)

संबंधित मुद्दे