起因
接到個任務 需要微博,QQ,百度,人人等聯合登錄。然后花了一天時間整理了一下,寫給大家分享下。
想法:
1. 首先想到的是QQ登錄,跑到QQ互聯折騰了一下,注冊開發者哇,然后填寫應用信息哇,
最后發現QQ登錄的域名不能有端口,服務器外網帶端口號的,然后就撤退了。
2 轉戰百度開放者平台,說實話這個平台看的眼花繚亂的,雲存儲雲服務的,想到以前的bae,還以為是百度的托管平台似的。
百度這里面有個坑,中間有個第三方的登錄,一看還以為是自己找的,然后點擊進去了。

看了下例子,android,ios,js,反正就是找不到web,汗!有個js的登錄例子,里面用了些百度的JS,找找百度的JS庫,發現需要下載SDK,感覺是客戶端東東,然后就算了重新搜索了。

繼續bing搜索呢 ,這次搜到百度API里面去了,打開網站就看到一段描述
1、支持多家主流社交平台賬號 支持百度、新浪微博、騰訊微博、QQ、人人、開心網等多家平台的賬號系統幫助用戶低成本登錄。 2、最簡單化的接入賬號 適用於PC&移動,只需簡單配置和調用,即可輕松搭建完成賬號功能。
感覺是自己想要的接口了,然后點進去又吐血了,又回到第二步的百度SDK例子了。

然后繼續看了看這個百度API的網站 發現下面推薦服務 有個百度帳號連接有點像,然后點那個SDK與文檔進去看看文檔。

然后找到了以下幾個重要文檔了。
正式開發
有文檔了就開始忙活了,首先想到的是調試,然后想到了花生殼,然后去花生殼官網,剛好看到了內網映射一塊錢支付免費用。
然后就下了客戶端 配了本機映射,開始寫代碼咯。
對着這個一步步的做,這里有有個坑了,百度的指南是2.0版本的,現在3.0了有些地方不一樣。不過好在只是界面不一樣,編碼流程是不變的。
1.進百度開發者服務 創建工程

2.這里寫你的網站名字,然后勾選合作網站,解決方案bae不要勾選。

3.以上2步就已經把網站接入到bae了,然后點擊應用,進入應用設置,設置一下網站的描述,這樣用戶跳轉的時候會有對該網站的有好描述

4.設置社會化服務回調地址,跟指南第二步一樣的寫就好了,這里的地址寫花生殼解析的外網地址,不過跟官網文檔不一樣的就是,設置的位置變了。

5 托管第三方應用
讓百度托管 QQ 微博 開心 人人等登錄設置,這里簡單使用的話,默認的就可以了,讓百度給我們做好了集成,如果不用默認的話,自己就要去各個平台去建立APP,拿到API KEY啥的。一個個做關聯。
6 用JS登錄獲取授權碼
下面有個注意的
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>
這個樣式的設置地址在下圖。

6 下一步就是根據得到的CODE來POST請求獲取用戶的實際信息了,例子是PHP代碼,JAVA的處理方法也差不多只是語法不一樣。
我這里有部分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; }
