تم تنفيذ JSON Web Token (JWT) ، وهو قياسي مفتوح (RFC 7519) تم تنفيذه لتمرير الإعلانات بين بيئات تطبيقات الشبكة. تم تصميم الرمز المميز ليكون مضغوطًا وآمنًا ، وخاصة مناسبة لسيناريوهات تسجيل الدخول (SSO) للمواقع الموزعة.
تُستخدم عبارات JWT عمومًا لتمرير معلومات هوية المستخدم المصادقة بين مزود الهوية ومزود الخدمة لتسهيل اكتساب الموارد من خادم الموارد. يمكن أيضًا إضافة بعض معلومات الإعلان الإضافية اللازمة لمنطق الأعمال الآخر. يمكن أيضًا استخدام الرمز المميز للمصادقة أو التشفير.

HMAC-SHA256(SecretKey, Base64UrlEncode(JWT-Header)+'.'+Base64UrlEncode(JWT-Payload))base64(header).base64(payload).signaturecomposer require tinywan/jwt use Tinywan Jwt JwtToken ;
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' email ' => ' [email protected] '
];
$ token = JwtToken:: generateToken ( $ user );
var_dump ( json_encode ( $ token ));الإخراج (تنسيق JSON)
{
"token_type" : " Bearer " ,
"expires_in" : 36000 ,
"access_token" : " eyJ0eXAiOiJAUR-Gqtnk9LUPO8IDrLK7tjCwQZ7CI... " ,
"refresh_token" : " eyJ0eXAiOiJIEGkKprvcccccQvsTJaOyNy8yweZc... "
}معلمات الاستجابة
| المعلمة | يكتب | يصف | مثال القيم |
|---|---|---|---|
| token_type | خيط | نوع الرمز المميز | حامل |
| expires_in | int | وقت صحة القسيمة ، الوحدة: ثواني | 36000 |
| Access_Token | خيط | الوصول إلى بيانات الاعتماد | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| refresh_token | خيط | تحديث بيانات الاعتماد (انتهت صلاحية بيانات اعتماد الوصول) | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
1. احصل على id الحالي
$ id = Tinywan Jwt JwtToken:: getCurrentId ();2. احصل على جميع الحقول
$ email = Tinywan Jwt JwtToken:: getExtend ();3. احصل على حقول مخصصة
$ email = Tinywan Jwt JwtToken:: getExtendVal ( ' email ' );4. قم بتحديث الرمز المميز (احصل على رمز الوصول عن طريق الرمز المميز المنعش)
$ refreshToken = Tinywan Jwt JwtToken:: refreshToken ();5. الوقت المتبقي لفترة صلاحية الرمز المميز
$ exp = Tinywan Jwt JwtToken:: getTokenExp (); 6. تسجيل الدخول جهاز واحد. الافتراضي هو خارج. يرجى تعديل config/plugin/tinywan/jwt
' is_single_device ' => true,تدعم تسجيل الدخول إلى الجهاز الواحد تحديد حقول
clientوتخصيص تسجيل الدخول الفردي العميل (الافتراضي هوWEB، أي صفحة الويب) ، مثل:MOBILE،APP،WEB،ADMIN،API،OTHER، إلخ.
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => ' MOBILE ' ,
];
$ token = Tinywan Jwt JwtToken:: generateToken ( $ user );
var_dump ( json_encode ( $ token ));7. الحصول على معلومات المستخدم الحالية (النموذج)
$ user = Tinywan Jwt JwtToken:: getUser (); مشروع التكوين 'user_model' هو دالة مجهولة المصدر ، والتي تُرجع مجموعة فارغة بشكل افتراضي. يمكنك تخصيص نموذج الإرجاع الخاص بك وفقًا لمشروعك orm
تكوين Thinkorm
' user_model ' => function ( $ uid ) {
// 返回一个数组
return think facade Db:: table ( ' resty_user ' )
-> field ( ' id,username,create_time ' )
-> where ( ' id ' , $ uid )
-> find ();
}تكوين Laravelorm
' user_model ' => function ( $ uid ) {
// 返回一个对象
return support Db:: table ( ' resty_user ' )
-> where ( ' id ' , $ uid )
-> select ( ' id ' , ' email ' , ' mobile ' , ' create_time ' )
-> first ();
}8. تنظيف الرمز المميز
$ res = Tinywan Jwt JwtToken:: clear ();فقط إذا كان عنصر التكوين
is_single_devicetrue، فهل سيكون ساري المفعول. المعلمات الاختيارية:MOBILE،APP،WEB،ADMIN،API،OTHER، إلخ.
9. client الطرفية المخصصة
// 生成WEB令牌
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => JwtToken:: TOKEN_CLIENT_WEB
];
$ token = JwtToken:: generateToken ( $ user );
// 生成移动端令牌
$ user = [
' id ' => 2022 ,
' name ' => ' Tinywan ' ,
' client ' => JwtToken:: TOKEN_CLIENT_MOBILE
];
$ token = JwtToken:: generateToken ( $ user ); الافتراضي هو WEB
10. تخصيص وقت انتهاء الصلاحية الرمز المميز للوصول وتحديث الرمز المميز
$ extend = [
' id ' => 2024 ,
' access_exp ' => 7200 , // 2 小时
];
$ token = Tinywan Jwt JwtToken:: generateToken ( $ extend );11. رمز خطأ انتهاء الصلاحية الرمزية
401011401012401013401014401015401021401022401023401024401025 خوارزميات توقيع JWT الأكثر شيوعًا (JWA): HS256(HMAC-SHA256) و RS256(RSA-SHA256) و ES256(ECDSA-SHA256)
+--------------+-------------------------------+--------------------+
| " alg " Param | Digital Signature or MAC | Implementation |
| Value | Algorithm | Requirements |
+--------------+-------------------------------+--------------------+
| HS256 | HMAC using SHA - 256 | Required |
| HS384 | HMAC using SHA - 384 | Optional |
| HS512 | HMAC using SHA - 512 | Optional |
| RS256 | RSASSA - PKCS1 -v1_5 using | Recommended |
| | SHA - 256 | |
| RS384 | RSASSA - PKCS1 -v1_5 using | Optional |
| | SHA - 384 | |
| RS512 | RSASSA - PKCS1 -v1_5 using | Optional |
| | SHA - 512 | |
| ES256 | ECDSA using P- 256 and SHA - 256 | Recommended+ |
| ES384 | ECDSA using P- 384 and SHA - 384 | Optional |
| ES512 | ECDSA using P- 521 and SHA - 512 | Optional |
| PS256 | RSASSA - PSS using SHA - 256 and | Optional |
| | MGF1 with SHA - 256 | |
| PS384 | RSASSA - PSS using SHA - 384 and | Optional |
| | MGF1 with SHA - 384 | |
| PS512 | RSASSA - PSS using SHA - 512 and | Optional |
| | MGF1 with SHA - 512 | |
| none | No digital signature or MAC | Optional |
| | performed | |
+--------------+-------------------------------+--------------------+
The use of " + " in the Implementation Requirements column indicates
that the requirement strength is likely to be increased in a future
version of the specification.يمكنك أن ترى أن RS256 و ES256 فقط موصى بها.
يستخدم التثبيت المكون الإضافي خوارزمية التشفير المتماثل
HS256بشكل افتراضي.
يستخدم HS256 نفس 「secret_key」 للتوقيع والتحقق. بمجرد تسرب secret_key ، لا يوجد أمان على الإطلاق. لذلك ، فإن HS256 مناسب فقط للمصادقة المركزية ، ويجب إجراء كل من التوقيعات والتحقق من قبل الأطراف الموثوقة.
تم توقيع سلسلة RS256 باستخدام مفتاح RSA الخاص والتحقق منه باستخدام مفتاح RSA Public.
حتى لو تم تسريب المفتاح العام ، فلن يكون له أي تأثير. فقط تأكد من أن المفتاح الخاص آمن. يمكن لـ RS256 تفويض التحقق من التطبيقات الأخرى ، فقط أعطهم المفتاح العام.
فيما يلي أوامر توليد خوارزمية سلسلة RS للرجوع إليها فقط
ssh-keygen -t rsa -b 4096 -E SHA512 -m PEM -P "" -f RS512 .key
openssl rsa -in RS512 .key -pubout -outform PEM -out RS512 .key.pubssh-keygen -t rsa -b 4096 -E SHA354 -m PEM -P "" -f RS384 .key
openssl rsa -in RS384 .key -pubout -outform PEM -out RS384 .key.pubssh-keygen -t rsa -b 4096 -E SHA256 -m PEM -P "" -f RS256 .key
openssl rsa -in RS256 .key -pubout -outform PEM -out RS256 .key.pubيمكن للطلاب الذين لا يفهمون التعرف على الفيديو ، وسيكون هناك تعليمات مفصلة.
https://www.w3cschool.cn/fastapi/fastapi-cmia3lcw.html
هناك العديد من الطرق للتعامل مع قضايا مثل الأمن ومصادقة الهوية والترخيص. وغالبًا ما يكون هذا موضوعًا معقدًا و "صعبًا". في العديد من الأطر والأنظمة ، لا يتطلب التعامل مع الأمان ومصادقة الهوية سوى الكثير من الجهد والرمز (في كثير من الحالات ، قد يفسر 50 ٪ أو أكثر من جميع الكود المكتوب).
يساعدك JWT في التعامل مع الأمان بسهولة وبسرعة بطريقة قياسية دون البحث وتعلم جميع مواصفات السلامة.
لنفترض أن لديك واجهة برمجة تطبيقات الخلفية في مجال. ولديك واجهة أمامية في مسار مختلف (أو تطبيق للجوال) في مجال آخر أو نفس المجال. وتريد أن تكون هناك طريقة للحصول على الواجهة الأمامية للمصادقة مع الواجهة الخلفية باستخدام اسم المستخدم وكلمة المرور. يمكننا استخدام OAuth2 لبناءها من خلال JWT.
username password في الواجهة الأمامية ونقرات إدخال.username password إلى واجهة برمجة التطبيقات الخاصة بنا في عنوان URL محدد (لإعلان tokenUrl="token" ).Authorization رأس مع Bearer القيمة بالإضافة إلى الرمز المميز. إذا كان الرمز المميز يحتوي على foobar ، فسيكون محتوى رأس Authorization : Bearer foobar .注意:中间是有个空格.