أهلاً،
بقدر ما نرغب في أن نكون قادرين على العمل على جميع أنظمة OSS في العالم، فإننا لا نستخدم هذه المكتبة بشكل نشط بعد الآن. وهذا يعني أنه سيتم دمج الميزات الجديدة / إصلاحات الأخطاء / وما إلى ذلك فقط بناءً على طلبات السحب من المساهمين الخارجيين ، ونحن ننصحك بشدة بالبحث عن بديل طويل الأمد.
إذا كنت تبحث عن مكتبة تتم صيانتها بشكل نشط، فتحقق من firebase/php-jwt!
توفر هذه المكتبة تطبيقًا خفيفًا لمواصفات JWS (JSON Web Signature).
تحتاج هذه المكتبة إلى PHP 5.5+ والمكتبة OpenSSL.
لقد تم اختباره باستخدام PHP5.5
إلى PHP7.0
و HHVM
.
يمكنك تثبيت المكتبة مباشرة من الملحن/packagist:
"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()، لذلك سيحاول جوزيه التحقق من صحة الرمز المميز باستخدام الخوارزمية المحددة في رأس الرمز المميز، على الرغم من أن هذا قد يعرضك لبعض المشكلات الأمنية.
في الوقت الحالي، نوصي دائمًا بتعيين الخوارزمية التي تريد استخدامها بشكل صريح للتحقق من صحة الرموز المميزة.
قد تجد أنك بحاجة إلى استخدام هذه المكتبة في بيئة لا تعمل فيها أغلفة 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. تعمل فئة SimpleJWS على توسيع فئة JWS الأساسية وتضيف التحقق من صحة TTL وإدراج المطالبات التلقائية.
قدم القدرة على تحديد محرك التشفير. تمت إضافة دعم PHPSecLib إلى تطبيق OpenSSL الحالي.
تمت إضافة القدرة على تعيين الخصائص المخصصة في الرأس. تم نقل التضمين التلقائي لبعض المطالبات إلى فئة SimpleJWS من فئة JWS الأساسية.
تم نقل phpseclib وامتداد openssl كتبعيات مقترحة.
تتم كتابة الاختبارات باستخدام PHPUnit لهذه المكتبة. بعد تثبيت الملحن، يمكنك تنفيذ الأمر التالي لتشغيل الاختبارات:
./vendor/bin/phpunit
هذه المكتبة مستوحاة من العمل الأولي الذي قام به @ritou.