第三方登录,回调页面跳转
Ajk研究院系统,通过中国经纪人后台登录,记录Session,实现页面跳转。
- 第三方登录原理
- 具体代码实现
第三方登录原理
(1)客户端向后台发送请求,带着回调页面的路径。
示例:http://www.qq.com?redirect_uri=http%3A%2F%2Fwww.baidu.com%3F
(2)登录成功时带着token回调到redirect_uri
示例: http://www.baidu.com?token=ba0fedb46bc5685d58ee150cafb62b5e
(3)授权成功后,再次请求后台,拿到相关的信息,最终返回登录后的页面。
示例:请求路径http://www.baidu.com
表格
授权登录URL参数:授权成功的回调URL地址
参数 | 值 |
---|---|
redirect_url | www.baidu.com |
授权成功后再次请求参数:带着成功后的token,再此请求,获得登录用户的基本信息
参数 | 值 |
---|---|
token | ba0fedb46bc5685d58ee150cafb62b5e |
具体代码实现
代码块
回调路径代码(得到用户基本信息,存到session里面,进行页面跳转):
@RequestMapping(value = "/login-vip", method = RequestMethod.GET)
public String loginByVIP(HttpServletRequest request) {
BrokerUserSession brokerUserSession = validateToken(request);
if (brokerUserSession == null) {
return "redirect:" + UrlUtil.getBaseUrl(request) + "/?from=login";
} else {
httpSession.setAttribute(SESSION_BROKER_KEY, brokerUserSession);
return "redirect:" + UrlUtil.getBaseUrl(request) + "/ajk-esf";
}
}
验证token信息
public BrokerUserSession validateToken(HttpServletRequest request) {
String token = request.getParameter("token");
JSONObject jsonObject = null;
BrokerUserSession broker = null;
if (!StringUtils.isEmpty(token)) {
// 带着token,继续请求后台,获得用户相关信息
String url = connurl + "?token=" + token + "&appname=" + appname + "×tamp=" + timestamp + "&sign="
+ sign;
//获得请求后的返回信息
jsonObject = httpGet(url);
if (jsonObject == null || "false".equals(jsonObject.get("data").toString())) {
return null;
}
if (jsonObject.getJSONObject("data").get("brokerId") == null) {
return null;
}
//此处读取信息,并存入session
}
return broker;
}
带着token和后台需要的参数,继续请求后台,最终获取用户的相关信息
public static JSONObject httpGet(String url) {
// get请求返回结果
JSONObject jsonResult = null;
try {
CloseableHttpClient client = HttpClients.createDefault();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
String strResult = EntityUtils.toString(response.getEntity());
jsonResult = JSONObject.fromObject(strResult);
url = URLDecoder.decode(url, "UTF-8");
} else {
logger.error("get请求提交失败:" + url);
}
} catch (IOException e) {
logger.error("get请求提交失败:" + url, e);
}
return jsonResult;
}
注意事项
- 拦截器设置
- userContoller里面需要对获得的用户信息进行全面判断
- 还有loginout的注销用户信息
- 固定的信息,写在配置文档。例如:basepath等