Я пытаюсь настроить механизм входа на платформу Discourse с помощью единого входа.На данный момент кажется, что это работает, но только если пользователь уже вошел на основной сайт, он может автоматически войти на форум.
Чего я пытаюсь достичь в концедень есть;как только пользователь пытается войти на форум, он должен немедленно перенаправить на страницу, относящуюся к основному сайту, если пользователь не вошел на основной сайт, ему необходимо увидеть страницу входа на основном сайте и после того, как он выполнил вход в систему, пользователь снова должен быть перенаправлен на форум.
Итак, у меня есть специальный URL для sso на моем основном сайте, как: example.com/ssoLogin Вот метод запроса:
@GetMapping("/ssoLogin")
String ssoRequest(RedirectAttributes redirectAttributes, @RequestParam String sso, @RequestParam String sig ) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
String a ="";
if (checksum("I_love_sso", sso).equals(sig)){
HttpSession session = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession();
User loggedUser = (User) session.getAttribute("user");
if(loggedUser!=null){
String urlDecode = URLDecoder.decode(sso,"UTF-8");
String nonce = new String(Base64.getUrlDecoder().decode(urlDecode.getBytes("UTF-8")));
String urlEncode = nonce
+ "&name=" + URLEncoder.encode(loggedUser.getName(),"UTF-8")
+ "&username=" + URLEncoder.encode(loggedUser.getUsername(),"UTF-8")
+ "&email=" + URLEncoder.encode(loggedUser.getEmail(),"UTF-8")
+ "&external_id=" + URLEncoder.encode(Long.toString(loggedUser.getId()),"UTF-8");
String urlBase64 = new String(Base64.getUrlEncoder().encode(urlEncode.getBytes("UTF-8")));
int length = 0;
int maxLength = urlBase64.length();
final int STEP = 60;
String urlBase64Encode = "";
while (length < maxLength) {
urlBase64Encode += urlBase64.substring(length, length + STEP < maxLength ? length + STEP : maxLength) + "\n";
length += STEP;
}
a = "redirect:http://forum.example.com/session/sso_login?sso=" + URLEncoder.encode(urlBase64Encode,"UTF-8") + "&sig=" + checksum("I_love_sso",urlBase64Encode);
}else{
redirectAttributes.addAttribute("sso",sso);
redirectAttributes.addAttribute("sig",sig);
a="redirect:/login";
}
}
return a;
}
Метод POST страницы входа на главную страницу моего сайта:
@PostMapping("/login")
ResponseEntity<?> loginRequest(@RequestParam String username, @RequestParam String password, @RequestParam(required = false)String sso, @RequestParam(required = false)String sig){
try {
authService.login(username, password);
HttpSession session = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession();
User loggedUser = (User) session.getAttribute("user");
} catch (Exception e) {
return ResponseEntity.ok(singletonMap("error", "Login credentials wrong!"));
}
if(sso==null && sig==null){
return ResponseEntity.ok("/");
}else{
return ResponseEntity.ok("forum.example.com");
}
}
Метод GET моей страницы входа в систему:
@GetMapping("/login")
String loginPage(@RequestParam(required = false) String sso, @RequestParam(required = false) String sig) {
return "login";
}
Итак, здесь, в моей реализации, даже я думаю, что sso и sigпараметры были перенесены на перенаправленный URL, не похоже, что он работает, потому что я был перенаправлен на главную страницу основного сайта.