zoukankan      html  css  js  c++  java
  • WEB端第三方登陆接入

    准备工作就不说了,需要开通QQ登陆功能

    流程是这样的:

    1 - 前端先发送一个GET请求,带着要求的参数,会跳转一个qq登陆页面

    2 - 前端还要有一个页面用于处理用户登陆成功后跳转的,会携带code

    3 - 拿着code请求后端接口,后端拿着code请求access_token

    4 - 再用access_token获取用户openId

    5 - 根据openId查询用户,查到就进行登陆

    另外,还有一个绑定功能

    上代码:

    1 - 前端GET请求,打开网页

    const base_uri = 'https://graph.qq.com/oauth2.0/authorize?'
    const app_id = '...'
    const redirect_uri = 'encode后的uri'
    const uri = base_uri + 'response_type=code&client_id=' + app_id + '&redirect_uri=' + redirect_uri + '&state=自己定义用于区分状态'
    window.location.href = uri

    2 - 在redirect_uri页面处理请求,代码就不写了

    // 从url中获取参数code
    // 携带code参数请求后端接口获取openId

    3 - 后端请求方法,获取openId

    public String getQQOpenId(String code) {
        StringBuilder accessTokenUri = new StringBuilder();
        accessTokenUri.append("https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=").append(qqAppId);
        accessTokenUri.append("&client_secret=").append(qqAppKey);
        accssTokenUri.append("&code=").append(code);
    // 此处redirectUri不需要encode accessTokenUri.append(
    "&redirect_uri=").append(redirectUri); String accessTokenResponse = httpUtils.Get(accessTokenUri.toString()); Map<String, String> responseMap = getUriParams(accessTokenResponse); String accessToken = responseMap.get("access_token"); String openIdUri = String.format("https://graph.qq.com/oauth2.0/me?access_token=%s", accessToken); String openIdResponse = httpUtils.Get(openIdUri); JSONObject responseJobj = getCallbackParams(openIdResponse.trim()); return responseJobj.getString("openid"); }

    4 - 用到的方法

    public JSONObject getCallbackParams(String callback) {
        return JSONObject.fromObject(callback.substring(9, callback.length() - 2).trim());
    }
    
    public Map<String, String> getUriParams(String uri) {
        if (RegexUtils.isNullOrEmpty(uri)) {
            return null;
        }
        String[] params = uri.split("&");
        Map<String, String> paramsMap = new HashMap<>();
        for (String para : params) {
            String[] arr = para.split("=");
            paramsMap.put(arr[0], arr[1]);
        }
        return paramsMap;
    }

    5 - qq登陆,接口就不写了,无非就是有token返回token,没token就提示

    public String qqLogin(String code) {
        String openId = getQQOpenId(code);
        User user = ...通过openId获取用户;
        if (user == null) {
            return null;
        }
    // 登录成功,返回用户token
    return getUserToken(user); }

    至此,qq登录已完成,经过测试

    6 - qq绑定

    说下流程就好了.

    首先用户处于登录状态,后端可以在请求接口时通过token获取到用户

    前端有个绑定按钮,用户点击

    再走一遍qq登录流程,获取openId,保存,这个openId一个用户一个

    前端可以自定义state参数,区分登陆和绑定

    至此,qq绑定已完成,经过测试

    知止而后有定;定而后能静;静而后能安;安而后能虑;虑而后能得。
  • 相关阅读:
    Android实现简单的检测手机自由落体关闭屏幕
    Android Disable Package/Component 跳过app安装
    求单向链表中倒数第k个节点(c++):快慢指针/递归
    算法学习笔记---链表与数组
    pycharm使用matplotlib绘图学习笔记
    pycharm使用matplotlib绘制图像报错
    python numpy学习笔记
    python刷leetcode算法-- 左旋转字符串
    机器学习算法扫盲篇
    Kaggle入门篇
  • 原文地址:https://www.cnblogs.com/SamNicole1809/p/13564528.html
Copyright © 2011-2022 走看看