สวัสดี,
เท่าที่เราต้องการสามารถทำงานกับ OSS ทั้งหมดในโลกได้ เราก็ไม่ได้ใช้ไลบรารีนี้อีกต่อไป ซึ่งหมายความว่าคุณสมบัติใหม่ / การแก้ไขข้อบกพร่อง / ฯลฯ จะถูกรวมเข้าด้วยกันตามคำขอดึงจากผู้มีส่วนร่วมภายนอกเท่านั้น และเราขอแนะนำอย่างยิ่งให้คุณมองหาทางเลือกระยะยาว
หากคุณกำลังมองหาห้องสมุดที่ได้รับการดูแลอย่างดี ให้ตรวจสอบ firebase/php-jwt out!
ไลบรารีนี้มีการนำข้อกำหนด JWS (JSON Web Signature) ไปใช้เพียงเล็กน้อย
ไลบรารีนี้ต้องการ PHP 5.5+ และไลบรารี OpenSSL
ได้รับการทดสอบโดยใช้ PHP5.5
ถึง PHP7.0
และ HHVM
คุณสามารถติดตั้งไลบรารี่ได้โดยตรงจากผู้แต่ง / ผู้จัดแพ็คเกจ:
"namshi/jose": "7.0.*"
การใช้งานค่อนข้างตรงไปตรงมา ลองจินตนาการว่าคุณต้องการเสนอบริการที่มีความสามารถในการตรวจสอบสิทธิ์ผู้ใช้ผ่านคุกกี้ และบริการดังกล่าวสร้างขึ้นด้วยจาวาสคริปต์ สิ่งที่คุณต้องทำคือสร้าง JWS (หลังจากตรวจสอบข้อมูลรับรองหนึ่งครั้ง) จัดเก็บเป็นคุกกี้แล้วส่งต่อจากแอป JavaScript ของคุณทุกครั้งที่คุณต้องการตรวจสอบสิทธิ์ผู้ใช้นั้น
ขั้นแรก สร้าง 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 ());
}
จากนั้นแอป JS ของคุณสามารถใช้คุกกี้ที่มีอยู่เพื่อดำเนินการโทรที่ได้รับการตรวจสอบสิทธิ์ โดยไม่ต้องส่งรหัสผ่านหรือข้อมูลประจำตัว
เมื่อส่งคำขอแล้ว คุณเพียงแค่ต้องยืนยันว่าเป็นการโทรที่ถูกต้อง:
<?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 ' ]);
}
เคล็ดลับ: คุณสามารถละเว้นอาร์กิวเมนต์ที่สองของเมธอด isValid() ได้ ดังนั้น jose จะพยายามตรวจสอบโทเค็นด้วยอัลกอริทึมที่ระบุในส่วนหัวของโทเค็น แม้ว่าการทำเช่นนี้อาจทำให้คุณประสบปัญหาด้านความปลอดภัยก็ตาม
สำหรับตอนนี้ เราขอแนะนำให้ตั้งค่าอัลกอริทึมที่คุณต้องการใช้เพื่อตรวจสอบโทเค็นอย่างชัดเจนเสมอ
คุณอาจพบว่าคุณจำเป็นต้องใช้ไลบรารีนี้ในสภาพแวดล้อมที่ wrapper ของ PHP สำหรับ OpenSSL ใช้งานไม่ได้ หรือ OpenSSL ไม่ได้ติดตั้งไว้ ไลบรารีนี้ใช้ OpenSSL เพื่อเข้ารหัสตามค่าเริ่มต้น แต่คุณสามารถระบุได้ว่าต้องการใช้ PHPSecLib สำหรับการใช้ PHP ของการเข้ารหัส RSA เพียงอย่างเดียว
ในกรณีเหล่านี้ เพียงเพิ่มพารามิเตอร์ทางเลือก 'SecLib'
เมื่อสร้าง JWS:
$ jws = new JWS ( array ( ' alg ' => ' RS256 ' ), ' SecLib ' );
ตอนนี้คุณสามารถใช้งาน PHPSecLib ของการเซ็นชื่อ RSA ได้แล้ว หากคุณใช้คีย์ส่วนตัวที่ป้องกันด้วยรหัสผ่าน คุณยังคงสามารถส่งคีย์ส่วนตัวเพื่อใช้สำหรับการเซ็นชื่อเป็นสตริงได้ ตราบใดที่คุณส่งรหัสผ่านเป็นพารามิเตอร์ตัวที่สองในวิธี sign
:
$ jws -> sign ( file_get_contents ( SSL_KEYS_PATH . " private.key " ), ' tests ' );
คุณยังสามารถโหลด JWS โดยใช้ PHPSecLib ของการตรวจสอบ RSA ได้:
$ jws = JWS :: load ( $ tokenString , false , $ encoder , ' SecLib ' );
เพื่อตรวจสอบ JWS ลายเซ็นจะได้รับการตรวจสอบด้วยกุญแจสาธารณะก่อน จากนั้นเราจะตรวจสอบว่าโทเค็นหมดอายุหรือไม่
หากต้องการให้ JWS เป็น TTL เพียงใช้ค่า exp
มาตรฐานในเพย์โหลด:
$ date = new DateTime ( ' tomorrow ' );
$ this -> jws = new SimpleJWS ( array ( ' alg ' => ' RS256 ' ));
$ this -> jws -> setPayload ( array (
' exp ' => $ date -> format ( ' U ' ),
));
คุณสามารถอนุญาต JWSes ที่ไม่ปลอดภัยได้โดยตั้งค่าสถานะ $allowUnsecure
ขณะโหลด JWSes:
JWS :: load ( $ this -> jws -> getTokenString (), true );
ซึ่งจะทำให้โทเค็นที่เซ็นชื่อด้วยอัลกอริธึม "ไม่มี" สามารถผ่านไปได้ ซึ่งเป็นสิ่งที่คุณอาจไม่ต้องการทำ ดำเนินการด้วยความระมัดระวัง :)
JWSes ที่ไม่ปลอดภัยจะถูกปิดใช้งานตามค่าเริ่มต้นตั้งแต่เวอร์ชัน 2.2.2 คุณไม่ควรใช้เวอร์ชันก่อนหน้านอกเหนือจาก 2.2.2 เนื่องจากมีช่องโหว่ด้านความปลอดภัย ข้อมูลเพิ่มเติมที่นี่
หากคุณจำเป็นต้องเข้ารหัสโทเค็นด้วยวิธีอื่นด้วยเหตุผลบางประการ คุณสามารถแทรกการใช้งาน NamshiJOSEBase64Encoder
ในอินสแตนซ์ JWS
ได้ ในทำนองเดียวกัน JWS::load()
ยอมรับการใช้งานดังกล่าวเป็นอาร์กิวเมนต์ที่สอง
ไลบรารีจัดเตรียมคลาส JWT พื้นฐานที่ใช้สิ่งที่จำเป็นสำหรับ JSON Web Tokens เท่านั้น จากนั้นคลาส JWS จะขยายคลาส JWT และเพิ่มการใช้งานสำหรับการลงนามและการตรวจสอบโดยใช้ JSON Web Signatures คลาส SimpleJWS ขยายคลาส JWS พื้นฐาน และเพิ่มการตรวจสอบความถูกต้องของ TTL และการรวมการอ้างสิทธิ์อัตโนมัติ
แนะนำความสามารถในการระบุกลไกการเข้ารหัส เพิ่มการรองรับ PHPSecLib ในการใช้งาน OpenSSL ที่มีอยู่
เพิ่มความสามารถในการตั้งค่าคุณสมบัติที่กำหนดเองในส่วนหัว ย้ายการรวมการอ้างสิทธิ์บางอย่างโดยอัตโนมัติไปยังคลาส SimpleJWS จากคลาส JWS พื้นฐาน
ย้าย phpseclib และส่วนขยาย openssl ตามการอ้างอิงที่แนะนำแล้ว
การทดสอบเขียนโดยใช้ PHPUnit สำหรับไลบรารีนี้ หลังจากทำการติดตั้ง composer คุณสามารถรันคำสั่งต่อไปนี้เพื่อรันการทดสอบ:
./vendor/bin/phpunit
ห้องสมุดนี้ได้รับแรงบันดาลใจจากงานเริ่มแรกที่ทำโดย @ritou