先讲一下这个是什么问题
有一个平台想不登录就可以直接访问一个已经存在登录验证的平台,大概就是这么一个场景。
但是这里有一个问题就是不同域名不同端口的就是属于跨域,这样是不可能把缓存数据cookie写到对应的浏览器跳过验证的,这里就用到了Nginx来监听同一域名同一端口下的地址,进行写入。
先处理业务上获取第三方的token验证相关数据
这个接口是用来后面Nginx访问触发的。这里验证数据我就写死了,大致怎么获取要看对接的平台的业务逻辑,无非就是用个账号登录获取最新的。
@RestController
@RequestMapping("/sso")
public class SsoTestController {
@GetMapping("/aisLogin")
public ModelAndView aisLogin(HttpServletRequest request, HttpServletResponse response) {
String token ="eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6IjRiMjNlNDliLWFjYzItNDE0MC04NGI3LTJjNjhmMTUwODFjZSIsInVzZXJuYW1lIjoiYWRtaW4ifQ.Bcv86XX0bp6Ie421EMdfV-dhKhynz2dgjrhFxbJpfnlrlu8ThqpvVpLnehvk-Ijf8lYTAwO8g88Rrt2SOPewQQ";
// 这里new一个对象作为返回值,填对应的中转页viewName,添加中转也接受的值处理.
ModelAndView model = new ModelAndView();
model.setViewName("login");
model.addObject("token",token);
// 这里是写入cookie数据
Cookie cookie = new Cookie("Admin-Token", token);
// 主要这地址是要跳转的平台的地址,path要用/
cookie.setDomain("192.168.124.27");
cookie.setPath("/");
response.addCookie(cookie);
Cookie cookie1 = new Cookie("Admin-Expires-In", "720");
cookie1.setPath("/");
cookie1.setDomain("192.168.124.27");
response.addCookie(cookie1);
response.setHeader("Authorization","Bearer "+token);
return model;
}
}
添加一个中转页
在后台添加一个中转页,用来接受数据。处理数据然后跳转到对应的页面
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<script th:inline="javascript" type="text/javascript">
<!--获取对应的页面数据 -->
const token = [[${token}]]
console.log("token:{}",token);
<!--数据添加到缓存中 -->
window.localStorage.setItem("token",{"value":token});
window.sessionStorage.setItem("token",{"value":token});
<!--跳转的页面,要保证这个地址和nginx监听的地址端口要一致 -->
window.location.replace("http://192.168.124.15:81/index");
</script>
<body>
<div>Login page</div>
</body>
</html>
配置nginx监听、跳转
server {
# 监听的是对应的要写入的端口
listen 81;
server_name 192.168.124.15;
location / {
proxy_pass http://192.168.124.27:81/;
proxy_set_header Host $host:$server_port;
}
# 这个地址是用来监听nginx来访问81带路径触发后台的功能进行业务逻辑处理
location /sso {
proxy_pass http://192.168.124.15:9088/sso/aisLogin/;
proxy_set_header Host $host:$server_port;
}
}
这样大概的配置就完成,就可以进行访问了。
这里访问的地址应该是这样的
niginxIP + 监听端口+ 监听路径
也就是和前端页面在一个IP + Nginx监听端口+监听路径
192.168.124.15:81/sso
这样用postMan请求上面的地址 访问成功就可以直接在页面上测试了。