Hai, yang di sana,
sebesar keinginan kami untuk dapat mengerjakan seluruh OSS yang ada di dunia, kami tidak lagi aktif menggunakan perpustakaan ini. Artinya, fitur-fitur baru/perbaikan bug/dll hanya akan digabungkan berdasarkan permintaan tarik dari kontributor eksternal , dan kami sangat menyarankan Anda mencari alternatif jangka panjang.
Jika Anda mencari perpustakaan yang dipelihara secara aktif, periksa firebase/php-jwt out!
Pustaka ini menyediakan implementasi ringan dari spesifikasi JWS (JSON Web Signature).
Perpustakaan ini membutuhkan PHP 5.5+ dan perpustakaan OpenSSL.
Telah diuji menggunakan PHP5.5
hingga PHP7.0
dan HHVM
.
Anda dapat menginstal perpustakaan langsung dari composer/packagist:
"namshi/jose": "7.0.*"
Cara menggunakannya cukup mudah: bayangkan Anda ingin menawarkan layanan kemampuan untuk mengautentikasi pengguna melalui cookie, dan layanan tersebut dibuat dengan javascript; yang perlu Anda lakukan adalah membuat JWS (setelah memverifikasi kredensial satu kali), menyimpannya sebagai cookie, lalu meneruskannya dari aplikasi JavaScript setiap kali Anda ingin mengautentikasi pengguna tersebut.
Pertama, buat JWS:
<?php
use Namshi JOSE SimpleJWS ;
if ( $ username == ' correctUsername ' && $ pass == ' ok ' ) {
$ user = Db :: loadUserByUsername ( $ username );
$ jws = new SimpleJWS ( array (
' alg ' => ' RS256 '
));
$ jws -> setPayload ( array (
' uid ' => $ user -> getid (),
));
$ privateKey = openssl_pkey_get_private ( " file://path/to/private.key " , self :: SSL_KEY_PASSPHRASE );
$ jws -> sign ( $ privateKey );
setcookie ( ' identity ' , $ jws -> getTokenString ());
}
Kemudian aplikasi JS Anda dapat menggunakan cookie yang tersedia untuk menjalankan panggilan yang diautentikasi, tanpa mengirimkan kata sandi atau kredensial.
Setelah permintaan dikirimkan, Anda hanya perlu memverifikasi bahwa itu adalah panggilan yang valid:
<?php
use Namshi JOSE SimpleJWS ;
$ jws = SimpleJWS :: load ( $ _COOKIE [ ' identity ' ]);
$ public_key = openssl_pkey_get_public ( " /path/to/public.key " );
// verify that the token is valid and had the same values
// you emitted before while setting it as a cookie
if ( $ jws -> isValid ( $ public_key , ' RS256 ' )) {
$ payload = $ jws -> getPayload ();
echo sprintf ( " Hey, my JS app just did an action authenticated as user #%s " , $ payload [ ' uid ' ]);
}
PROTIP: Anda dapat menghilangkan argumen kedua dari metode isValid(), jadi jose akan mencoba memvalidasi token dengan algoritma yang ditentukan dalam header token, meskipun hal ini mungkin membuat Anda terkena beberapa masalah keamanan.
Untuk saat ini kami menyarankan untuk selalu mengatur secara eksplisit algoritma yang ingin Anda gunakan untuk memvalidasi token.
Anda mungkin perlu menggunakan perpustakaan ini di lingkungan di mana wrapper PHP untuk OpenSSL tidak berfungsi, atau OpenSSL tidak diinstal. Pustaka ini menggunakan OpenSSL untuk mengenkripsi secara default, namun Anda dapat menentukan bahwa Anda ingin menggunakan PHPSecLib untuk implementasi PHP murni enkripsi RSA.
Dalam kasus ini, cukup tambahkan parameter opsional 'SecLib'
saat membuat JWS:
$ jws = new JWS ( array ( ' alg ' => ' RS256 ' ), ' SecLib ' );
Anda sekarang dapat menggunakan implementasi PHPSecLib untuk penandatanganan RSA. Jika Anda menggunakan kunci pribadi yang dilindungi kata sandi, Anda masih dapat mengirimkan kunci pribadi untuk digunakan dalam penandatanganan sebagai string, selama Anda memasukkan kata sandi sebagai parameter kedua ke dalam metode sign
:
$ jws -> sign ( file_get_contents ( SSL_KEYS_PATH . " private.key " ), ' tests ' );
Anda juga dapat memuat JWS menggunakan implementasi verifikasi RSA PHPSecLib:
$ jws = JWS :: load ( $ tokenString , false , $ encoder , ' SecLib ' );
Untuk memvalidasi JWS, tanda tangan terlebih dahulu diverifikasi dengan kunci publik dan kemudian kami akan memeriksa apakah token sudah kadaluwarsa.
Untuk memberikan TTL pada JWS, cukup gunakan nilai exp
standar di payload:
$ date = new DateTime ( ' tomorrow ' );
$ this -> jws = new SimpleJWS ( array ( ' alg ' => ' RS256 ' ));
$ this -> jws -> setPayload ( array (
' exp ' => $ date -> format ( ' U ' ),
));
Anda dapat mengizinkan JWS yang tidak aman dengan menyetel tanda $allowUnsecure
saat memuat JWS:
JWS :: load ( $ this -> jws -> getTokenString (), true );
Hal ini memungkinkan token yang ditandatangani dengan algoritma 'tidak ada' untuk dilalui, sesuatu yang mungkin tidak ingin Anda lakukan. Lanjutkan dengan hati-hati :)
JWS yang tidak aman dinonaktifkan secara default sejak versi 2.2.2. Anda tidak boleh menggunakan versi sebelumnya selain 2.2.2 karena memiliki kerentanan keamanan. Info lebih lanjut di sini.
Jika, karena alasan tertentu, Anda perlu menyandikan token dengan cara yang berbeda, Anda dapat memasukkan implementasi apa pun dari NamshiJOSEBase64Encoder
ke dalam instans JWS
. Demikian pula, JWS::load()
menerima implementasi seperti argumen kedua.
Perpustakaan menyediakan Kelas JWT dasar yang mengimplementasikan apa yang diperlukan hanya untuk Token Web JSON. Kelas JWS kemudian memperluas kelas JWT dan menambahkan implementasi untuk penandatanganan dan verifikasi menggunakan JSON Web Signatures. Kelas SimpleJWS memperluas kelas dasar JWS dan menambahkan validasi TTL dan penyertaan klaim otomatis.
Memperkenalkan kemampuan untuk menentukan mesin enkripsi. Menambahkan dukungan PHPSecLib ke implementasi OpenSSL yang ada.
Menambahkan kemampuan untuk mengatur properti khusus di header. Memindahkan penyertaan otomatis klaim tertentu ke dalam kelas SimpleJWS dari kelas dasar JWS.
Memindahkan phpseclib dan ekstensi openssl sebagai dependensi yang disarankan.
Tes ditulis menggunakan PHPUnit untuk perpustakaan ini. Setelah melakukan instalasi komposer Anda dapat menjalankan perintah berikut untuk menjalankan tes:
./vendor/bin/phpunit
Perpustakaan ini terinspirasi oleh karya awal yang dilakukan oleh @ritou.