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 ที่แอปพลิเคชันที่ติดตั้งใช้ก่อนปรับโค้ด อย่าใส่วัตถุเหล่านั้นลงในการกำหนดค่านี้