Tuesday, December 18, 2018

Firebase: Verify ID Token with Admin SDK in Java Backend Server

Halo geeks,

Kali ini saya akan membahas tentang implementasi Admin SDK - Verify ID Token untuk memeriksa apakah token yang dikirim oleh client app(android/iOS) sesuai dengan yang di-generate oleh Firebase atau telah dimanipulasi dari sisi client app.


PENGENALAN

Sebagai contoh, pada penerapan Google Sign-In pada client app, client app akan mengirimkan request menggunakan akun Gmail ke Firebase, yang kemudian client app mengambil ID Token yang berisi data terkait akun yang berhasil masuk dari GoogleSignInAccount objek, info pada ID Token ini yang kemudian akan diperiksa di backend server. 

Pada sisi client app, akan mengirim ID Token ke backend server melalui HTTPS POST request.
Untuk memastikan bahwa Token sesuai, dapat dipastikan dari beberapa poin ini:
  • ID Token memiliki signature yang diberikan oleh Google yang dapat diperiksa menggunakan Google Public Key (JWK atau PEM format).
  • aud pada ID Token harus sama dengan Project ID.
  • iss pada ID Token harus https://securetoken.google.com/<projectId> dimana <projectId> harus sama dengan aud
Pada sisi backend server, ID Token yang diterima akan diperiksa keasliannya dan mengambil uid dari token tersebut untuk mengidentifikasi user yang sedang mengakses aplikasi.

IMPLEMENTASI

Sebelum memulai, kita harus memiliki service account di firebase.

MENAMBAHKAN FIREBASE KE APLIKASI

Untuk menggunakan admin SDK, kita harus membuat Firebase Project terlebih dahulu yang akan digunakan untuk terhubung ke Firebase Service, dan file konfigurasi yang berisi credential akun project yang berformat JSON.
  1. Tambah Project baru di firebase jika belum ada, melalui halaman Firebase Console.
  2. Setelah berhasil menambahkan project baru, masuk halaman Service Account.
  3. Klik tombol Generate New Private Key pada bagian bawah Firebase Admin SDK.
Anda akan menerima file JSON yang berisi credential akun.


MENAMBAHKAN SDK

Tambahkan libary ke java backend server pada file pom.xml
<dependency>
  <groupId>com.google.firebase</groupId>
  <artifactId>firebase-admin</artifactId>
  <version>6.6.0</version>
</dependency>

INISIALISASI SDK

Pada bagian ini kita akan menginisialiasi SDK yang terdapat file JSON yang telah berhasil kita download dari firebase.

FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");
FirebaseOptions options = new FirebaseOptions.Builder()
    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();
FirebaseApp.initializeApp(options);
Note: database_name disesuaikan database yang pada Firebase Project.

VERIFIKASI ID TOKEN

Untuk memeriksa token dari akun yang sedang mengakses aplikasi, kita dapat menggunakan method verifyIdToken()yang telah tersedia di Admin SDK.
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();
untuk memeriksa ID Token, dibutuhkan project ID yang didapat dari field project_id pada file JSON tadi.

TAMBAHAN

Contoh file JSON yang berisik credential project pada firebase
json-firebase-credential

Contoh ID Token(JWT) yang diterima backend server dari clien app
{
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile" and
 // "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

KESIMPULAN

Kita perlu melakukan verifikasi ID Token untuk memastikan bahwa user yang sedang mengakses aplikasi memang merupakan user yang asli/sah sehingga terhindar dari mallicious-ware yang dapat mencuri informasi dan menyebabkan kerugian baik sisi user maupun aplikasi.


Untuk kesalahan penulisan maupun pemahaman/konsep dapat ditambahkan pada kolom komentar.

Terimakasih.

sumber: firebase, google

No comments:

Post a Comment