第三方登录原理及实现

第三方登录,回调页面跳转

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;
    }

注意事项

  1. 拦截器设置
  2. userContoller里面需要对获得的用户信息进行全面判断
  3. 还有loginout的注销用户信息
  4. 固定的信息,写在配置文档。例如:basepath等

你可能感兴趣的:(第三方登录原理及实现)