场景描述:我公司开发的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