接到個任務 須要微博,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; }