Spring Security 6.5: העברת חילופי קוד ההרשאה של OAuth דרך פרוקסי
תנו ללקוח תגובת האסימון של קוד ההרשאה ב-Spring Security RestClient שמודע לפרוקסי, תוך שמירה על ממירי ה-OAuth ומטפל השגיאות שלו.
הדפדפן מגיע לספק הזהות, ואז הכניסה נכשלת כאשר היישום מחליף את קוד ההרשאה שהוחזר. החלפה זו היא בקשה יוצאת משרת היישום, עם לקוח HTTP משל עצמו.
עבור ה-API מבוסס RestClient הזמין ב-Spring Security 6.5, ספקו מפעל בקשות שמודע לפרוקסי ללקוח תגובת האסימון של קוד ההרשאה:
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setProxy(new java.net.Proxy(
java.net.Proxy.Type.HTTP,
new java.net.InetSocketAddress("proxy.example", 8080)));
factory.setConnectTimeout(5000);
factory.setReadTimeout(15000);
RestClient tokenHttp = RestClient.builder()
.requestFactory(factory)
.messageConverters(converters -> {
converters.clear();
converters.add(new FormHttpMessageConverter());
converters.add(new OAuth2AccessTokenResponseHttpMessageConverter());
})
.defaultStatusHandler(new OAuth2ErrorResponseErrorHandler())
.build();
RestClientAuthorizationCodeTokenResponseClient tokenClient =
new RestClientAuthorizationCodeTokenResponseClient();
tokenClient.setRestClient(tokenHttp);
מחלקות הממיר ומטפל השגיאות משמרות את התנהגות בקשת האסימון המתועדת של Spring Security. RestClient כללי שהוגדר רק עבור API JSON לא קשור אינו תחליף שקול.
חברו את אותו tokenClient לתצורת האבטחה הקיימת:
http.oauth2Login(login -> login
.tokenEndpoint(token -> token
.accessTokenResponseClient(tokenClient)));
אלה קטעי תצורה ליישום שכבר יש לו רישום לקוח ו-SecurityFilterChain. הם בוחרים פרוקסי HTTP ללא אימות; פרוקסי הדורש פרטי התחברות זקוק לתצורת האימות המתאימה של התעבורה הנבחרת. עבור נקודת קצה של אסימון HTTPS הנגישה לציבור בנתיב ציבורי מותר, רשומת HTTP מרשימת פרוקסי ה-HTTP יכולה למלא את כתובת הפרוקסי ללא חשבון.
הפרידו את מארח הפרוקסי מהפורט ומסכמת ה-URL שלו. השאירו את URI האסימון של ספק הזהות כיעד. הדוגמה אינה מחליפה אימות תעודות.
בקשות מאוחרות יותר זקוקות לבדיקת בעלות משלהן. אחזור UserInfo, חילופי אסימון רענון, מענקי client-credentials וקריאות API מוגנות יכולים להשתמש באובייקטי לקוח אחרים. הגדירו את הלקוח הנתמך המתאים כאשר גם הפעולה הזו זקוקה לנתיב. עבור זרימת client_credentials הריאקטיבית של Spring Security 6.5, הגדירו את לקוח האסימון הריאקטיבי ואת ספק המענקים שלו בנפרד.
דוגמאות ישנות המשתמשות ב-OAuth2RestTemplate וב-AccessTokenProvider שייכות לפרויקט Spring Security OAuth הישן יותר. בחרו את ה-API שבו משתמש היישום המותקן לפני התאמת קוד; אל תערבבו את האובייקטים האלה בתצורה הזו.