Menembus api https + csrf yii dgn cordova

Langsung saja sy mw nanya ni. Sy sedang buat aplikasi android onlineshop menggunakan vuejs dibuild dengan cordova. Masalahnya sy harus bikin api dgn yii v1, karena website onlineshop yg berjalan pakai yii. Nah karena sy bikin api pakai yii tsb, otomatis semua request harus lewat protocol https, hasilnya sy tidak dapat memanggil request karena terhalang https yg harus sign certificate terlebih dahulu. Sy coba jalanlan di debug mode: true, request dapat dipanggil, aplikasi berjalan dgn baik, masalahnya app nya mau diupload ke play store, play store ga boleh upload app yg debug mode true. Sy bingung harus digimanain. Belum lagi setiap request berbentuk post diproteksi dgn csrf token, anehnya sy udah kirim variable YII_CSRF_TOKEN tetap aja ga mau lewat, padahal keynya dah bener sy generate. Ada yg tau ga solusinya utk melewati https dan csrf di yii ini kalau kita requestnya CORS dari app android?

avatar QaiserLab
@QaiserLab

366 Kontribusi 390 Poin

Diperbarui 7 tahun yang lalu

7 Jawaban:

saya ngga pernah pake YII, dan pengalaman csrf ini ngga berhubungan langsung dengan https. Bisa lebih detail informasinya? 1. Apakah akses apinya pake AJAX atau gimana ? 2. Contoh kodenya bagian akses dan bagian server (penyedia API) 3. Diatas ada bilang, kalau ngga tembus masalah YII_CSRF_TOKEN, tapi kita ngga tahu salahnya dimana.

Saran saya pecah pertanyannya kalo kepanjangan, lebih spesifik satu-satu mana yang mau ditanyakan, sertakan kode yang relevan dan juga error yang bisa dibantu

avatar hilmanski
@hilmanski

2673 Kontribusi 2133 Poin

Dipost 7 tahun yang lalu

iya mas hilman. emang ga da hubungan antara https dan csrf tapi dua2nya jadi masalah saya, :D

sy urai lagi ni

A. masalah https setelah sy compile jadi apk, api ga mau dipanggil menggunakan AJAX. masalahnya karena, kalau di web browser kita bisa pilih advanced > exception certificate, utk mengizinkan mengakses https. karena aplikasi di compile dgn cordova menjadi apk, ga ada pilihan utk sign certification begitu ketika aplikasi dibuka. hasilnya semua akses ke api ditolak server. kecuali, sy ubah android:debuggable="true" di AndroidManifest.xml. kalau sudah mode debug akses api ke server dapat berjalan dengan baik. tapi sy baca2 referensi google play store ga mau nerima aplikasi yg debug mode nya true.

B. masalah csrf jika kita lihat di source code client side sy utk pemanggilan AJAX. sy sudah menyertakan kode utk mengambil CSRF token di server dan sy sertakan di next request, jika request gagal/failed. tapi tetap saja hasilnya ditolak dengan yii

dari dua masalah diatas sudah jelas masalah utamanya ditolak oleh server. soalnya kalau sy debug mode true dan csrf di yii saya matiin. aplikasi sy dapat berjalan dengan baik. tapi sy tetap harus bisa jalanin 2 point tersebut tanpa ada yg sy matiin. karena sy ulangi lagi masalahnya play store ga nerima debug mode true dan yii csrf tentu perlu utk security di bagian website yg telah dibuat teman sy (kecuali ada cara utk exception request tanpa csrf khusus utk request app android sy : ini yg mw sy tanya juga)

================================================================================= 1. Apakah akses apinya pake AJAX atau gimana ? pakai AJAX mas JQuery tepatnya $.ajax, $.get, $.post.

2. Contoh kodenya bagian akses dan bagian server (penyedia API)

ini potongan method di client side yg biasa sy panggil api.post(url, {..parameter...}, callback)

    post (url, data, callback) {

        if ($.isFunction(data)) {
            callback = data;
            data = {};
        }

        var url = $config.server.apiUrl + '/' + url;

        if (!localStorage.csrfToken) {
            $.get($config.server.apiUrl + '/getCsrfToken', (result) => {

                this.setCsrfToken(result.data);
                data.YII_CSRF_TOKEN = this.getCsrfToken();

                $.post(url, data, (result) => {
                    if ($.isFunction(callback))
                        callback(result);
                });
            });
        }
        else {

            data.YII_CSRF_TOKEN = this.getCsrfToken();

            $.post(url, data, (result) => {

                if ($.isFunction(callback))
                    callback(result);

            }).fail(() => {

                $.get($config.server.apiUrl + '/getCsrfToken', (result) => {

                    this.setCsrfToken(result.data);
                    data.YII_CSRF_TOKEN = this.getCsrfToken();

                    $.post(url, data, (result) => {
                        if ($.isFunction(callback))
                            callback(result);
                    });
                });

            });
        }

    }

ini potongan method di server utk mengambil CSRF Token

    private function generateToken() {
        $csrfToken = Yii::app()->request->csrfToken;

        return $csrfToken;
    }

    public function actionGetCsrfToken() {
        $csrfToken = $this->generateToken();
        $this->success('Data terbaca', $csrfToken);
    }

ini potongan method utk registrasi user di server (return-nya json utk success dan invalid).

    public function actionRegisterFree() {

        Yii::app()->member->setState('type', 'free');

        $Member = $this->getPost('Member');

        $model = new Member;

        $model->scenario = 'free';
        $model->attributes = $Member;

        if (!$model->validate())
            $this->invalid('Silakan perbaiki data berikut;', $model->getErrors());

        $model->is_completed = 0;
        $model->status = 1;

        if ($model->randomId == '1')
            $model->sponsor_mid='SYSTEM';

        $mtype = 0;
        $model->type = $mtype;

        if($model->save()) {

//            $this->saveToken($model);
            $this->sendSms($model->mobile_phone, 'Selamat,Anda sudah bergabung dengan Cozmeed Network,kami sudah mengirimkan detail ke email Anda.');

            if(Yii::app()->member->id)
                $this->success('Pendaftaran sudah berhasil, kami sudah mengirimkan detail akun ke email calon member');
            else
                $this->success('Pendaftaran sudah berhasil, kami sudah mengirimkan detail akun ke email Anda');

        }
        else
            $this->invalid('Registrasi gagal');
    }


avatar QaiserLab
@QaiserLab

366 Kontribusi 390 Poin

Dipost 7 tahun yang lalu

Untuk yang pertama coba cek article ini, pendek ko dan cukup jelas, ada dua kasus kalo di ios dan android http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-android-ios/ , saya ngga familiar sama yii, nanti saya lihat2

avatar hilmanski
@hilmanski

2673 Kontribusi 2133 Poin

Dipost 7 tahun yang lalu

ohya. bener kynya ni mas. ok nty sy coba modifikasi SystemWebViewClient.java

avatar QaiserLab
@QaiserLab

366 Kontribusi 390 Poin

Dipost 7 tahun yang lalu

mantap bener mas. lancar jaya, dah tembus https-nya. yg CSRF itu gmana mas ya? ada yg tau ga? kemaren sy letakan YII_CSRF_TOKEN nya di header request juga tetep aja ga bisa apa harus di letakan di cookie ya itu?

avatar QaiserLab
@QaiserLab

366 Kontribusi 390 Poin

Dipost 7 tahun yang lalu

mantap ! dibagian if sama else (ajaxnya) this.getCsrfToken(); kalau diconsole.log , nilainya keluar dan benar di dua2 nya ? coba YII_CSRF_TOKEN diganti jadi CSRF_TOKEN yang ajaxnya

avatar hilmanski
@hilmanski

2673 Kontribusi 2133 Poin

Dipost 7 tahun yang lalu

eh gan... udah bisa. padahal sy ga ngubah kode diatas gan. bingung sy juga gan. kalau beda ip dia ga mau. tapi kalau udah di kompilasi jadi apk, beda ip juga dia mau.

sip gan. thanx bantuan-nya

avatar QaiserLab
@QaiserLab

366 Kontribusi 390 Poin

Dipost 7 tahun yang lalu

Login untuk ikut Jawaban