第三方登录原理及实现

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

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_urlwww.baidu.com

授权成功后再次请求参数:带着成功后的token,再此请求,获得登录用户的基本信息

参数
tokenba0fedb46bc5685d58ee150cafb62b5e

具体代码实现

代码块

回调路径代码(得到用户基本信息,存到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 + "&timestamp=" + 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等
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值