ปัญหา invalid android_key parameter
หลักจากเขียนบทความเรื่อง สร้างปุ่ม Facebook Login บน Android ไป ปรากฎว่า มีคนที่ลองทำแล้วมีปัญหาเกิดขึ้นครับ วันนี้ก็เลยนำตัวอย่างปัญหาที่มีคนเจอ มาเล่าสู่กันฟัง รวมถึงวิธีการแก้ปัญหาที่เกิดขึ้นด้วย ต้องขอขอบคุณน้องที่ message มาถามปัญหาผมใน Facebook ครับ เลยได้บทความเขียนเลย
ตัวอย่างข้างล่างนี้ต่อยอด มาจากบทความที่แล้วนะครับ บางจุดผมก็จะไม่อธิบาย ที่มาที่ไป เพราะได้อธิบายไปในบทความก่อนแล้ว หากไม่เข้าใจ ก็ไปลองอ่านบทความก่อนได้ครับ
ปัญหา invalid android_key parameter
Invalid android_key parameter. The key zxcvasdfqwer12345678
does not match any allowed key. Configure your app key hashes at http://developers.facebook.com/apps/200000000
ปัญหานี้ เกิดจาก Facebook มองว่า Hashes Key ที่เราได้ทำการตั้งค่าตรง Facebook App เพื่อขอสิทธิ์ Permission การใช้แอพนั้น มันไม่ตรงกับ debug.keystore หรือ signing.keystore ของเราครับ ซึ่งตั้งแต่ผมใช้ทำมา หรือเทส ก็ไม่เคยเจอปัญหาลักษณะเช่นนี้เลย อาจเป็นเพราะ OS คนละ OS กัน เพราะผมใช้ Ubuntu ก็เป็นได้ ทำให้เวลาเราทำการ Login Facebook ในแอพของเรานั้น ไม่สามารถทำการ Login ได้
Hashes Key ไม่ตรงกัน
การ Generate Hashes Key ด้วยการใช้ Keytool ตามข้างล่างนี้
Mac หรือ Ubuntu
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
สำหรับ Windows ใช้คำสั่งนี้
keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64
ปกติเมื่อใช้คำสั่งด้านบนลงไป จะมี prompt ให้กรอก password: ก็ให้ใส่คำว่า android ลงไป จากนั้นจะได้รหัส Hashes Key มา เช่น wer234sdxcvasdf23rhery จากนั้นเมื่อไปตั้งค่า ที่ Facebook App ปกติ ใช้ Hashes Key ที่ Gen จาก Keytool ก็ไม่มีปัญหาอะไร แต่ถ้าใครขึ้น error แบบด้านบน ที่เกริ่นมา แสดงว่า ไอ้ Hashes Key ที่เรา Gen กับ Keytool นั้นไม่ตรงกันละ วิธีแก้ไข คือ ทำการ Generate Hashes Key จากโปรแกรมของเราครับ
ทำการเปิดแอพของเรา ไปที่ MainActivity จากนั้นที่เมธอด onCreate()
ก็ทำการเพิ่มโค๊ดข้างล่างนี้ลงไป
try {
PackageInfo info = getPackageManager().getPackageInfo(
"YOUR_PACKAGE_NAME", PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest messageDigest = MessageDigest.getInstance("SHA");
messageDigest.update(signature.toByteArray());
Log.d("KeyHash: ", Base64.encodeToString(messageDigest.digest(),
Base64.DEFAULT));
}
} catch (PackageManager.NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
แล้วก็ทำการ import ข้างล่างนี้ลงไปด้วย
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
จากด้านบน คือโปรแกรมจะทำการ Generate เมื่อทำการเปิดแอพพลิเคชัน โดยสิ่งที่คุณต้องทำการเปลี่ยนก็คือ YOUR_PACKAGE_NAME เป็นชื่อ Package ของคุณเอง จากนั้นก็สั่งรันโปรแกรม ดูที่ Logcat เลือก Log Level เป็น Debug มองหาคำว่า KeyHash: xxxxxxx ดูว่า Hashes Key ที่โปรแกรม Gen กับ ที่Gen ผ่าน Keytool มันตรงกันมั้ย คิดว่าน่าจะไม่ตรง เราก็จะใช้ Hashes Key อันนี้แหละ ไปตั้งค่าใน Facebook App ใหม่ เป็นอันเรียบร้อย สั่งรันโปรแกรม แล้วลอง Login ดูผลลัพธ์ครับ
ลืมตั้งค่า Sandbox Mode
ผมเรียกมันว่า Sandbox Mode เนื่องจากเมื่อก่อน มันมีชื่อว่าแบบนี้ แต่ว่าตอนนี้มันเปลี่ยนเป็น ต้องการตั้งค่าให้ Application เป็นแบบ General Public หรือไม่
ไปที่ Facebook App เลือก Application ของเรา จากนั้นไปที่แท็ป Status & Review เลือกตรง Do you want to make this app and all its live features available to the general public? เป็น YES ดังรูป
หากเราไม่ตั้งค่าตรงนี้ เวลาเราใช้งาน Facebook SDK เราจะใช้งานใน Mode Sandbox ก็คือใช้ได้เฉพาะเราเองคนเดียว เห็นเองคนเดียว เวลาโพสอะไรก็เห็นแค่คนเดียว คนอื่นไม่เห็น นั่นเอง
- Authors
- Name
- Chai Phonbopit
- Website
- @Phonbopit