Thursday, September 13, 2012

Twitter OAuth - Failed to Validate Oauth Signature and Token

Ini masalah yang saya alami saat mengerjakan Twitter OAuth. Saya mencoba membuat login with Twitter di CodeIgniter dengan menggunakan tmhOAuth library. Saat saya coba di server lokal, OAuth berhasil, tetapi saat di upload ke server online muncul error:

Failed to Validate Oauth Signature and Token

Kemudian setelah googling, saya menemukan bahwa masalah ada di waktu server. Ternyata waktu server website yang saya kelola kita sebut saja website G, berbeda dengan waktu di server Twitter. Untuk menjalankan Twitter OAuth, waktu di server Twitter tidak boleh terlalu jauh dengan waktu server di website Anda.


Setelah saya cek waktu server di website G dan di server Twitter, ternyata perbedaan waktunya 10 jam XD (alias jam di server G memang ngaco :p), nah.. setelah saya searching.. searching.. ternyata kita harus merubah waktu (tahun:bulan:tanggal:jam:menit:detik) di server G, disamakan dengan waktu di Twitter. Masalahnya, saya tidak punya akses ke server G, yang bisa saya lakukan hanya mengakses file-file melalui FTP. Agak susah di tempat kerja saya kalau mengenai peruhan sistem di server, prosesnya lama. Awalnya saya sudah down, mengingat masalah nya ternyata ada di server. Sampai akhirnya saya menemukan di diskusi twitter https://dev.twitter.com/discussions/686

Di sana dikatakan bahwa untuk mengatasi perbedaan waktu server antara website Anda dengan Twitter, ada alternatif lain, selain merubah jam di server Anda. Yaitu dengan “menipu” server Twitter.

Pada tmhOAuth library, kita mengirimkan waktu server, date(), ke twitter. Jika waktu berbeda jauh, maka twitter akan menolak autentikasi (tidak tau kenapa). Maka kita harus memanipulasi waktu yang kita kirimkan ke twitter, bagaimana caranya?

Awalnya pada tmhOAuth library, terdapat fungsi create_timestamp(), seperti berikut:

$this->config['timestamp'] = ($this->config['force_timestamp'] == false ? time() : $this->config['timestamp']);

Dengan time(), kita mengirimkan waktu server kita ke twitter. Tidak masalah jika waktu server Anda benar, tapi jika tidak, maka gunakanlah cara berikut ini, ganti isi fungsi create_timestamp() di atas dengan code berikut:

// Ambil waktu server di Twitter
$request_url="https://dev.twitter.com/docs/api/1/get/help/test";
$twheader = get_headers($request_url, 1); // ---- array dengan ['Date'] string
$twistamp = strtotime($twheader['Date']); // ---- twitter timestamp

// Gunakan twitter timestamp untuk dikirim kembali ke Twitter
$this->config['timestamp'] = ($this->config['force_timestamp'] == false ? $twistamp : $this->config['timestamp']);

Pertama kita ambil waktu dari server twitter. Setelah kita dapatkan, simpan di sebuah variabel, kemudian kita kirimkan ke Twitter sebagai waktu server kita.. :p
Waktu server yang kita kirimkan ke twitter di simpan di variabel bernama timestamp, kita kirimkan saja timestamp yang kita dapat dari Twitter, dengan begitu, waktu yang kita kirim, dengan waktu server di Twitter sudah pasti sama :D

Seperti itulah, agak sedikit curang, tapi sangat bermanfaat untuk saya (yang tidak punya akses ke server). Semoga akan membantu Anda yang juga punya masalah yang sama.

No comments:

Post a Comment