Discussions

Ask a Question
Back to all

Kesulitan Pertukaran Kode Otorisasi (Token Exchange) dengan PKCE

Halo Tim Scalev,

Saya sedang dalam proses mengintegrasikan aplikasi saya dengan Scalev menggunakan alur OAuth 2.0 Authorization Code with PKCE. Saya telah mengikuti dokumentasi yang tersedia dengan saksama, namun saya terus menerus mengalami kendala pada Step 6: Exchanging the Code for Tokens.

Berikut adalah rincian dari situasi yang saya hadapi:

Alur yang Berhasil:

  1. Step 2 (PKCE Parameters): Saya berhasil men-generate code_verifier dan code_challenge (SHA256, Base64-URL-encoded) dengan benar.
  2. Step 3 (Authorization Request): Saya berhasil mengarahkan pengguna ke https://app.scalev.id/oauth/authorize dengan parameter yang lengkap, termasuk code_challenge dan code_challenge_method=S256.
  3. Step 4 & 5 (User Authorization & Callback): Pengguna berhasil login, menyetujui aplikasi saya, dan saya berhasil menerima code dan state di redirect_uri yang telah saya daftarkan. Verifikasi state juga berhasil.

Titik Kegagalan (Step 6):

Masalah terjadi secara konsisten saat saya melakukan request POST ke https://api.scalev.id/v2/oauth/token untuk menukarkan code yang saya dapatkan. Saya selalu mendapatkan respons error, invalid_grant, The code verifier is invalid or does not match the code challenge.

Langkah-langkah Debugging yang Telah Saya Lakukan:

Untuk memastikan ini bukan kesalahan di sisi implementasi saya, saya telah mencoba berbagai pendekatan, namun semuanya gagal di titik yang sama:

  1. Manajemen code_verifier: Saya sangat yakin bahwa code_verifier yang saya kirimkan dalam request token adalah string asli yang sama persis dengan yang saya generate di awal alur.

    • Saya telah mencoba menyimpannya di server-side session (menggunakan express-session di Node.js).
    • Saya juga telah mencoba menyimpannya di database untuk memastikan tidak ada masalah persistensi.
    • Sebagai upaya terakhir, saya bahkan mencoba menyimpannya di localStorage (meski saya tahu ini tidak aman) hanya untuk memastikan verifier tidak berubah, dan hasilnya tetap sama.
  2. Platform & Bahasa Pemrograman: Saya telah mencoba mengimplementasikan alur ini menggunakan dua platform berbeda untuk mengesampingkan masalah library:

    • Golang: Menggunakan package golang.org/x/oauth2 dengan SetAuthURLParam untuk PKCE, dan juga implementasi vanilla (manual) menggunakan http.Client.
    • JavaScript (Node.js): Menggunakan axios untuk melakukan request manual.
  3. Detail Request: Saya telah memverifikasi berulang kali bahwa request POST ke endpoint token sudah benar:

    • Header Content-Type disetel ke application/json.
    • Body JSON berisi semua field yang dibutuhkan: grant_type: "authorization_code", code, client_id, client_secret, dan code_verifier.

Pertanyaan Saya:

Mengingat semua upaya di atas, saya curiga ada sesuatu yang saya lewatkan, terutama karena saya bekerja di lingkungan localhost.

  1. Apakah ada konfigurasi khusus atau gotcha yang perlu diperhatikan saat melakukan otorisasi dari localhost?
  2. Apakah ada detail spesifik terkait encoding code_verifier yang mungkin saya lewatkan (misalnya, masalah karakter khusus saat transit)?
  3. Mungkinkah tim Scalev dapat membantu memeriksa log di sisi server untuk client_id saya untuk memberikan petunjuk yang lebih jelas mengenai penyebab kegagalan verifikasi PKCE tersebut?

Saya bersedia memberikan client_id saya dan timestamp percobaan jika diperlukan untuk investigasi lebih lanjut.

Terima kasih banyak atas waktu dan bantuannya πŸ™