Oauth2_授权登录之access_token与open_id关联

场景描述:我公司开发的App需要集成甲方的第三方应用(H5),甲方要求实现授权登录,我方App账户需保证登录第三方应用,但又不想泄露过多信息给第三方。在这套流程体系中,本人对微信、支付宝、QQ的access_token与open_id如何关联进行猜想,并制定了自己的方案

方案说明:本方案主要目的是解决code、access_token与用户关联问题,因此对获取access_token\refresh_token\open_id方法不做过多描述

流程简述:本流程开始前第三方需注册并获得client_id、client_secret等关键信息

1.请求获取code

1.1第三方应用携带参数(redirect_uri、client_id)调用JS方法请求App获取code

 $(function(){
        $('body').on('click','.onClick_btn',function(){
            //获取操作系统信息
            var u = navigator.userAgent, app = navigator.appVersion;
            var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;//Android端
            var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);//iOS端    

            if (isAndroid) { //判断是否为Android操作系统
                //请求获取code,参数  用户注册应用得到的client_id  用户自定义的跳转地址
                test.getCode('client_id','redirect_uri');//交互方法由App和H5提前约定,如果使用vue不可使用此方法
            }
            else if (isIOS) {//判断是否为iOS操作系统
                //请求获取code
                         window.webkit.messageHandlers.getCode.postMessage

                         ({client_id:'client_id',redirect_uri:'redirect_uri'});//交互方法由App和H5提前约定
            }else{ //其它操作系统,无需任何处理
                 alert(redirect_uri);   
            }

        })
        
    });

1.2App接收到第三方请求后(App未登录需先登录),携带第三方参数(redirect_uri、client_id)、App登录用户信息请求App服务器获取code码,App服务端可以在此时将code与登录用户建立关联

//Android代码判断

 @android.webkit.JavascriptInterface
        public void getCode(String client_id, String redirect_uri) {
            if (MyConstants.isLogin) {
                //如果登陆了进行网络请求

                getNet(client_id,redirect_uri);

            } else {
                //如果没有登录跳转登录页面,返回空字符串
                DialogUtils.logDialog(H5Activity.this);
            }

        }

1.3App将请求得到的code码、redirect_uri返回给第三方应用

//想服务器做getCode请求

//获取返回值

JSONObject data = jo.getJSONObject("returnData");
if (data.optString("executeResult").equalsIgnoreCase("1")) {
    final String redirect_uri=data.optString("redirect_uri");
    final String code=data.optString("code");
    webView.post(new Runnable() {
        @Override
        public void run() {//将返回值传递给H5
            webView.loadUrl("javascript:redirect('" + redirect_uri+","+code + "')");//交互方法名由App和H5提前约定
        }
    });
} else {
    Toast.makeText(H5Activity.this, data.optString("message"), Toast.LENGTH_SHORT).show();
}

1.4第三方应用接收返回值并自定义处理

    function redirect(redirect_uri,code){//交互方法由App和H5提前约定
        //处理移动端返回redirect_uri、code
        //自定义操作(当前为重定向跳转,第三方也可进行其他操作)
        window.location.href = redirect_uri+'?code='+code
    }

2.请求获取access_token

用户根据1中得到的code请求access_token、refresh_token、open_id

3.根据token获取用户信息

用户根据2中得到的access_token、open_id获取用户信息

4.刷新token

用户根据2中得到的refresh_token定时刷新access_token

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值