JWT (JSON Web Token) هو معيار مفتوح قائم على JSON (RFC 7519) تم تنفيذه لتمرير المطالبات بين بيئات تطبيقات الشبكة. تم تصميم الرمز المميز ليكون مضغوطًا وآمنًا ، وخاصة مناسبة لسيناريوهات SSO-ON (SSO) المفردة للمواقع الموزعة. يتم استخدام عبارة JWT بشكل عام لتمرير معلومات هوية المستخدم المصادقة بين مقدمي الهوية ومقدمي الخدمات لتسهيل اكتساب الموارد من خادم الموارد. يمكن أيضًا إضافة بعض معلومات الإعلان الإضافية اللازمة لمنطق الأعمال الآخر. يمكن أيضًا استخدام الرمز المميز مباشرة للمصادقة أو التشفير.
عادة ، من المخاطرة للغاية فضح واجهة برمجة التطبيقات مباشرة. إذا كنت لا تتحدث عن أي شيء آخر ، فيمكنك شربه إذا تعرضت للهجوم مباشرة بواسطة آلة. بشكل عام ، يجب تقسيم مستوى إذن معين إلى API ، ثم يتم مصادقة المستخدم ، ويتم إعطاء واجهة برمجة التطبيقات المقابلة للمستخدم بناءً على نتائج المصادقة. في الوقت الحاضر ، هناك العديد من الحلول السائدة:
Oauth هو معيار تفويض مفتوح يسمح للمستخدمين بالسماح لتطبيقات الطرف الثالث بالوصول إلى الموارد الخاصة (مثل الصور ومقاطع الفيديو) المخزنة من قبل المستخدم على خدمة دون توفير اسم المستخدم وكلمة المرور لتطبيقات الطرف الثالث.
تتيح OAUTH للمستخدمين توفير رمز رمزي بدلاً من اسم المستخدم وكلمة المرور للوصول إلى البيانات التي يقومون بتخزينها في مزود خدمة معين. يصرح كل رمز بنظام طرف ثالث معين (على سبيل المثال ، موقع تحرير الفيديو) للوصول إلى مورد معين (على سبيل المثال ، مجرد مقطع فيديو في ألبوم معين) خلال فترة زمنية محددة (على سبيل المثال ، خلال الساعتين القادمين). وبهذه الطريقة ، تتيح OAuth للمستخدمين تفويض مواقع الويب الثالثة للوصول إلى معلومات محددة معينة يقومون بتخزينها في مقدمي الخدمات الآخرين ، بدلاً من جميع المحتوى
تتمثل آلية مصادقة ملفات تعريف الارتباط في إنشاء كائن جلسة على الخادم لطلب المصادقة ، وفي الوقت نفسه قم بإنشاء كائن ملف تعريف الارتباط على متصفح العميل ؛ يتم إحضار كائن ملف تعريف الارتباط إلى العميل لمطابقة كائن الجلسة على الخادم لتحقيق إدارة الحالة. بشكل افتراضي ، سيتم حذف ملفات تعريف الارتباط عندما نغلق المتصفح. ومع ذلك ، يمكنك تعديل وقت انتهاء صلاحية ملف تعريف الارتباط لجعل ملف تعريف الارتباط صالحًا لفترة معينة من الزمن. ستضع المصادقة بناءً على طريقة الجلسة حتماً بعض الضغط على الخادم (تخزين الذاكرة) ، وليس من السهل توسيعها (تتطلب التعامل مع الجلسات الموزعة) ، هجمات التزوير عبر المواقع (CSRF)
1. بالمقارنة مع الجلسة ، لا يلزم حفظها على الخادم ولا تشغل النفقات العامة لذاكرة الخادم.
2. عديمة الجنسية وقابلة للتطوير للغاية: على سبيل المثال ، هناك 3 آلات (A ، B ، C) لتشكيل مجموعة خادم. إذا كانت الجلسة موجودة على الجهاز A ، فلا يمكن حفظ الجلسة إلا على أحد الخوادم. في هذا الوقت ، لا يمكنك الوصول إلى الآلات B و C ، لأن الجلسة لا يتم تخزينها على B و C ، ويمكن استخدام الرموز التحقق من شرعية طلب المستخدم. لا بأس بالنسبة لي أن أضيف بضع آلات أخرى ، لذلك هذا ما يعنيه.
3. الفصل الأمامي ودعم الوصول عبر المجال.
- تكوين JWT
{"ISS": "JWT Builder" ، "IAT": 1416797419 ، "EXP": 144833419 ، "Aud": "www.battcn.com" ، "sub": "[email protected] "[email protected]" ، "الدور": ["المسؤول" ، "عضو"]}JWT هي في الواقع سلسلة ، تتكون من ثلاثة أجزاء ، رأس ، حمولة ، وتوقيع (مرتبة بالتسلسل في الصورة أعلاه)
مولد الرمز المميز JWT: https://jwt.io/
- مصادقة تسجيل الدخول
- طلب المصادقة
رمز غير صالح
رمز صالح
هناك مزايا وعيوب. سواء كان ذلك قابل للتطبيق ، ينبغي اعتباره واضحًا ، بدلاً من التكنولوجيا والأناقة.
رسم خرائط مفتاح TokenProperties مع Application.YML مورد ، سهل الاستخدام
@configuration@configurationProperties (prefix = "battcn.security.token") tokenProperties الفئة العامة { / *** {link com.battcn.security.model.token.token} وقت انتهاء صلاحية الرمز المميز ؛ / *** Issuer*/ Private String Issuer ؛ /*** Signature المستخدمة {link com.battcn.security.model.token.token}. */ سلسلة التوقيع الخاصة ؛ / *: // الحصول على تعيين ...} الفئة التي تم إنشاؤها بواسطة الرمز المميز
componentpublic class tokenfactory {private final tokenproperties properties ؛ @autowired tokenfactory (خصائص tokenProperties) {this.properties = properties ؛ } / ** * استخدم JJWT لإنشاء TOKEN * param context * @REGRAURN * / public AccessToken CreateAccessToken (سياق USERCONTEXT) {اختياري. اختياري. مطالبات المطالبات = jwts.claims (). setSubject (context.getUserName ()) ؛ Playss.put ("Scopes" ، context.getAuthorities (). Stream (). map (Object :: toString) .Collect (tolist ())) ؛ localDateTime currentTime = localDateTime.Now () ؛ TRING TOKEN = JWTS.BUILDER () .SETCLAIMS (المطالبات). .atzone (ZoneId.SystemDefault ()). toinstant ())) .Signwith (signureAlgorithm.hs512 ، properties.getSigningKey ()) .compact () ؛ إرجاع AccessToken الجديد (الرمز المميز ، المطالبات) ؛ } / ** * إنشاء وتحديث RefreshToken * param usercontext * return * / token public createrefreshtoken (UserContext usercontext) {if (stringutils.isblank (UserContext.getusername ()))) } localDateTime currentTime = localDateTime.Now () ؛ مطالبات المطالبات = jwts.claims (). setSubject (UserContext.getuserName ()) ؛ Playss.put ("Scopes" ، arrays.aslist (scopes.refresh_token.authority ())) ؛ TRING TOKEN = JWTS.BUILDER () .SETCLAIMS (المطالبات). .PlusMinutes (properties.getRefreshexptime ())) .AtZone (ZoneId.SystemDefault ()). toinstant ())) .Signwith (signaturealgorithm.hs512 ، properties.getSigningKey ()) .Compact () ؛ إرجاع AccessToken الجديد (الرمز المميز ، المطالبات) ؛ }} يمكن توسيع ملف التكوين ، بما في ذلك وقت انتهاء صلاحية الرمز المميز ، المفتاح السري
Battcn: الأمان: رمز: وقت انتهاء الصلاحية: 10 # دقائق 1440 refresh-exp-time: 30 # Minute 2880 Issuer: http://blog.battcn.com التوقيع: Battcn
WebSecurityConfig هو تكوين رئيسي لأمن الربيع. في الأمان ، يمكننا تنفيذ الوظائف التي نريدها بشكل أساسي من خلال تحديد المرشحات.
@configuration@enablewebsecuritypublic class websecurityconfig يمتد websecurityConfigurerAdapter {public static string token_header_param = "x-uunurization" ؛ Static Final String Form_Based_Login_entry_point = "/API/AUTH/LOGIN" ؛ Static Final String Token_BADER_AUTH_ENTRY_POINT = "/API/**" ؛ السلسلة النهائية الثابتة العامة manage_token_based_auth_entry_point = "/manage/**" ؛ Static Final String Token_Refresh_entry_point = "/API/AUTH/TOKEN" ؛ @autowired private restauthenticationentrypoint المصادقة. Autowired inigialitationsuccessHandler SuccessHandler ؛ @autowired المصادقة الخاصة failureDerler. @autowired loginauthenticationprovider loginauthenticationprovider ؛ Autowired TokenauthenticationProvider TokenaUthenticationProvider ؛ Autowired Private Tokenextractor Tokenextractor ؛ @AUTOWIRED InitienticationManager AuthenticationManager ؛ LogInProcessingFilter BuildLoginProcessingFilter () يلقي استثناء {logInProcessingFilter filter = new LogInProcessingFilter (form_based_login_entry_point ، SuccessHandler ، failureHandler) ؛ Filter.SetAuthenticationManager (this.AuthenticationManager) ؛ مرشح الإرجاع } tokenauthenticationprocessingfilter buildtokenauthenticationprocessingfilter () يلقي استثناء {list <string> list = lists.newarraylist (token_based_auth_entry_point ، manage_token_based_auth_entry_point) ؛ SkippathRequestMatcher Matcher = جديد SkippathRequestMatcher (قائمة) ؛ tokenauthenticationprocessingfilter filter = جديد tokenauthenticationprocessingfilter (FailureHandler ، tokenextractor ، matcher) ؛ Filter.SetAuthenticationManager (this.AuthenticationManager) ؛ مرشح الإرجاع } @Override Public AuthenticationManager AuthenticationManagerBean () يلقي الاستثناء {return Super.AuthenticationManagerBean () ؛ } override contected void config (AuthenticationManagerBuilder Auth) {auth.AuthenticationProvider (loginauthenticationProvider) ؛ Auth.AuthenticationProvider (TokenauthenticationProvider) ؛ } override contected void configure (httpsecurity http) يلقي استثناء {http .csrf (). disable () // لأنه يستخدم JWT ، يمكنك إيقاف تشغيل csrf هنا. .sessionCreationPolicy (SessionCreationPolicy.stateless). و (). .antmatchers (token_based_auth_entry_point) .Authenticated (). usernamepasswordauthenticationfilter.class) .addfilterbefore (BuildTokenAuthenticationProcessingfilter () ، usernamepasswordauthenticationfilter.class) ؛ }}نظرًا لأن رمز JWT مغلف ببساطة ويحتوي على الكثير من المحتوى ، يتم نشر الشظايا الرئيسية فقط في المقالة. إذا كانت الكود الكامل مطلوبًا ، يمكنك الحصول عليه مباشرة من GIT التالي
رمز هذا الفصل (Battcn-jwt-service): http://xiazai.vevb.com/201801/yuanma/battcn-cloud_jb51.rar
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.