接到个任务 须要微博,QQ,百度,人人等联合登陆。而后花了一天时间整理了一下,写给你们分享下。javascript
1. 首先想到的是QQ登陆,跑到QQ互联折腾了一下,注册开发者哇,而后填写应用信息哇,php
最后发现QQ登陆的域名不能有端口,服务器外网带端口号的,而后就撤退了。html
2 转战百度开放者平台,说实话这个平台看的眼花缭乱的,云存储云服务的,想到之前的bae,还觉得是百度的托管平台似的。java
百度这里面有个坑,中间有个第三方的登陆,一看还觉得是本身找的,而后点击进去了。android
看了下例子,android,ios,js,反正就是找不到web,汗!有个js的登陆例子,里面用了些百度的JS,找找百度的JS库,发现须要下载SDK,感受是客户端东东,而后就算了从新搜索了。ios
继续bing搜索呢 ,此次搜到百度API里面去了,打开网站就看到一段描述web
1、支持多家主流社交平台帐号 支持百度、新浪微博、腾讯微博、QQ、人人、开心网等多家平台的帐号系统帮助用户低成本登陆。 2、最简单化的接入帐号 适用于PC&移动,只需简单配置和调用,便可轻松搭建完成帐号功能。
感受是本身想要的接口了,而后点进去又吐血了,又回到第二步的百度SDK例子了。json
而后继续看了看这个百度API的网站 发现下面推荐服务 有个百度账号链接有点像,而后点那个SDK与文档进去看看文档。api
而后找到了如下几个重要文档了。服务器
有文档了就开始忙活了,首先想到的是调试,而后想到了花生壳,而后去花生壳官网,恰好看到了内网映射一块钱支付免费用。
而后就下了客户端 配了本机映射,开始写代码咯。
对着这个一步步的作,这里有有个坑了,百度的指南是2.0版本的,如今3.0了有些地方不同。不过好在只是界面不同,编码流程是不变的。
让百度托管 QQ 微博 开心 人人等登陆设置,这里简单使用的话,默认的就能够了,让百度给咱们作好了集成,若是不用默认的话,本身就要去各个平台去创建APP,拿到API KEY啥的。一个个作关联。
下面有个注意的
redirect_uri 必须和你第四步后台应用设置的同样 否则会报错
domid 这个是一个ID值,对应的是你界面方登陆图标的容器元素的 id
<script type="text/javascript" id="bd_soc_login_boot"></script> <script type="text/javascript"> (function(){ var t = new Date().getTime(), script = document.getElementById("bd_soc_login_boot"), redirect_uri = encodeURIComponent("http://xxx.eicp.net/xxxxx/other-login"), domid = "login", src = "http://openapi.baidu.com/social/oauth/2.0/connect/login?redirect_uri=" + redirect_uri + "&domid=" + domid + "&client_type=web&response_type=code&media_types=sinaweibo%2Cqqdenglu%2Cbaidu%2Cqqweibo%2Ckaixin%2Crenren&size=-1&button_type=4&client_id=xxxxxxxxx&view=embedded&t=" + t; script.src = src; })(); </script>
这个样式的设置地址在下图。
我这里有部分JAVA 伪代码给参考下
设计思想:
对原有用户表的一个扩充,加入了一个第三方登陆绑定表(用户表ID,平台类别,平台主键,平台用户名,访问受权码)等。
当登陆的时候 首先查询平台主键是否有关联用户表ID 若是有 查询出用户表ID 而后调用正常的登陆方法
若是没有,就新增用户,而后继续调用正常的登陆方法
@SkipCheck @Action("other-login") public String OtherLogin() throws Exception { String result = HttpKit.get(OtherLoginContent.url, getParam()); log.info(result); JSONObject map = com.alibaba.fastjson.JSON.parseObject(result); log.info(map.get("name")); //首先查询是否绑定 String customerNo = customerDao.selectOtherLogin(map.getString("social_uid")); if(customerNo==null){ //若是没有 用social_uid+name等当用户名自动添加用户 //而且自动关联绑定 customerNo=customerService.addOtherLink(map); } customer = customerDao.selectById(customerNo); return loginCheck();//正常的登陆流程 } private Map<String,String > getParam(){ String code = getParam("code"); Map<String,String > param = new HashMap<String,String>(); param.put("grant_type", "authorization_code");//固定 param.put("code", code); param.put("client_id", OtherLoginContent.client_id); param.put("client_secret", OtherLoginContent.client_secret); param.put("redirect_uri",OtherLoginContent.redirect_uri); return param; }