簡述前端
最近項目中有關於第三方登錄的需求,第三方Facebook以及Google +登陸。面試
正好這幾天把這個需求作得差很少了,收個尾,做爲一個這方面以前基本從未涉及的小白,總結下開發流程以及過程當中遇到的一些問題。但願能對你們有所幫助。ajax
基本上,目前互聯網上的涉及到第三方登陸採用的都爲OAuth認證方式,相關原理以及實現方法相關的能夠網上搜索查看。不過涉及到Facebook以及Google +的登錄,最大的問題是這兩個網站在牆外,想FQ找資料比較費勁,奈何國內這方面的資料也不是很齊全,翻到的官方的文檔又全是英文的,閱讀無能~json
第三方登錄簡單能夠分爲如下幾個步驟,分別是:得到第三方登錄許可認證;根據規範添加頁面登陸樣式和js實現,跳轉到第三方登錄頁面登錄並獲取受權後,返回原指定頁面(或請求);後臺對登陸信息進行校驗,並獲取對應第三方登錄用戶的信息;將第三方用戶信息與本系統用戶進行關聯。後端
下面就以上幾個步驟的一些關鍵信息,或者說是我開發當中遇到的問題作一下簡要的記錄。由於Facebook以及Google +第三方登錄都採用的是Auth2技術,所以只會在具體實現不一樣的地方單獨說明。理解有誤的地方,或者是沒有說全的地方,還請各位諒解~api
一 得到第三方登錄許可認證服務器
在獲取許可上,須要在對應的開發平臺上申請登錄接入許可,基本上你可能須要準備如下幾樣東西:cookie
你當前須要接入第三方登錄的網址域名(用於第三方平臺校驗是否這個登陸請求來自於你的網站自己);數據結構
給用戶展現的網站logo和文字(用於在第三方登錄的時候給用戶直觀的展(裝)示(逼));app
登錄成功後,跳回的URL(用於獲取並使用登錄用戶的相關信息);
申請成功以後,第三方平臺會提供給你對應的AppID以及AppSecret,用之後臺進行額外的操做。基本上操做按照官方api的順序一步一步來就能夠了惹,這裏就再也不贅述了~(請掌握基本的英語閱讀能力…)
二 根據規範添加頁面登陸樣式和js實現
簡單點講就是在頁面上添加登陸Button,並經過點擊觸發跳轉到第三方的請求。Google+以及Facebook在大致上邏輯一致,在細節上實現略有不一樣。
Google+登陸。會引用本身封裝的js()來實現登陸操做(gapi),並提供了多種登錄實現方案可供選擇。這裏貼一下,我目前項目中實現的方案,僅供參考。
1.在對應頁面引用Google第三方js。https://apis.google.com/js/api:client.js(這裏的js其實和官方最新的platform.js內容是同樣的…吧~)
2.頁面定義Google+登陸的按鈕樣式(這裏谷歌有內置的規範按鈕樣式能夠直接調用,不用本身定義)
(id="googleLogin")
3.根據引用的第三方js提供的api,做以下初始化操做:
auth2 = gapi.auth2.init({
client_id: clientID, //第一步申請的時候,提供給你的appidcookiepolicy: 'single_host_origin',
scope: 'https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/userinfo.email'//須要獲取的用戶信息領域});
4.初始化後,接着須要對你定義的按鈕綁定鼠標點擊事件,做以下操做:
auth2.attachClickHandler('googleLogin',{},startApp.onSuccess,startApp.onFailure);//googleLogin爲按鈕的ID
5.作完這些以後就等用戶點擊(上鉤)啦~這裏須要注意下startApp.onSuccess以及startApp.onFailure方法,這裏是在谷歌成功登錄以後的回調函數。在onSuccess裏第三方已經登陸並返回,咱們已經能夠根據接口api獲取想要的用戶信息了,而在onFailure裏由於登陸失敗,咱們能夠自定義一些提示信息。
6.等等!上面代碼中的變量都是幹嗎用的啊喂~別慌,下面附上完整的js!項目開發使用了RequireJs,代碼僅供參考!
View Code
Facebook登陸。一樣會調用本身封裝的js()來實現登陸操做(FB),實現步驟基本同Google+登錄相似。
1.在對應頁面引用Facebook第三方js。https: //connect.facebook.net/en_US/sdk.js;
2.頁面定義Facebook登陸的按鈕樣式
(id="fblogin")
3.根據引用的第三方js提供的api,做以下初始化操做:
FB.init ({
appId : '#your AppID#',
cookie : true,
xfbml : true,
version : 'v2.4'});
4.初始化後,接着須要對你定義的按鈕綁定鼠標點擊登陸事件,做以下操做:
$("#fblogin").click(function (){
FB.login(function(response) {
statusChangeCallback(response); //登陸回調函數},{scope: 'email'});//須要獲取的信息scope});
5.statusChangeCallback爲登陸回調函數,須要在裏面作下登錄返回的相關操做:
varstatusChangeCallback =function (response){
if(response.status === 'connected') {
varaccessToken = response.authResponse.accessToken;//取得 accessToken
FB.api('/me?fields=name,first_name,last_name,email',function(response) {// /me爲API指定的調用方法,用於獲取登錄用戶相關信息if(response.email!=null){
$.ajax({
url:"/action.do",
data:{
userName:response.name,
firstName:response.first_name,
lastName:response.last_name,
email:response.email,
idToken:accessToken,
userType:'2' },
dataType:"json",
tyep:"post",
success:function(data){
if(data.success ==true){
window.location.reload(true);
}
}
});
}else{
alert("XXX.");
}
});
}
};
更詳細的接口以及實現請參考最下面提供的官方API連接!多讀讀就懂了!
三 後臺對登陸信息進行校驗,並獲取對應第三方登錄用戶的信息
在用戶正確的登陸第三方平臺並進行受權以後,調用返回函數,這時須要對用戶的登陸信息和狀態進行確認!這裏很是關鍵,由於要確保用戶的確是從對應第三方平臺登陸,而不是隨隨便便敲一個URL就能讓請求經過了。因此咱們須要第三方平臺提供的access_token值,根據約定好的校驗規則進行校驗,放行校驗經過的登錄請求。
因爲驗證信息涉及到app的隱私信息,以及確保驗證不會被人爲的篡改,所以須要在服務器後端進行token的驗證。
參見第二條相關js實現,在第三方調用返回函數以後,代碼中會進行ajax請求,調用後臺的對應接口 /action.do,來在後臺進行access_token的正確性判斷。
後臺會根據登錄的第三方類型,進行https請求驗證,來確保用戶登錄的信息無誤。
Google+的token驗證地址:https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XXX
Google+的token驗證經過返回的Json格式(校驗aud是否與後臺保存的AppId匹配):
{
"iss": "https://accounts.google.com",
"sub": "110169484474386276334",
"azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"email": "billd1600@gmail.com",
"at_hash": "X_B3Z3Fi4udZ2mf75RWo3w",
"email_verified": "true",
"aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"iat": "1433978353",
"exp": "1433981953"
}
Facebook的token驗證地址(%7C爲encode的 '|'符號):https://graph.facebook.com/debug_token?access_token={Your AppId}%7C{Your AppSecret}&input_token=XXX
Facebook的token驗證經過返回的Json格式("is_valid": true):
{
"data": {
"app_id": 000000000000000,
"application": "Social Cafe",
"expires_at": 1352419328,
"is_valid":true,
"issued_at": 1347235328,
"scopes": [
"email",
"publish_actions" ],
"user_id": 1207059 }
}
由於這裏後臺採用JAVA開發,在驗證地址爲HTTPS請求驗證的時候,後臺利用HttpClient請求的時候涉及到證書驗證的問題,因此這裏採用了 @rongyongfeikai2同窗的方法:《JAVA利用HttpClient進行POST請求(HTTPS)》,有需求的能夠參考借鑑。
後臺根據對應官方的api文檔的token校驗方式,對獲取到的token進行校驗。若是請求的驗證地址返回的信息爲校驗經過,則能夠進行後面的操做了。
四 將第三方用戶信息與本系統用戶進行關聯
在進行前端js請求的時候,對應平臺的api接口會獲取到用戶的信息(參照上述代碼)。與此同時,在進行用戶token校驗的時候,返回的對應json對象中也會包含對應的用戶信息,這些信息能夠在後臺進行解析和獲取,詳細的數據結構能夠參考官方文檔。爲了確保用戶信息不會被中途截斷篡改,能夠在後臺進行數據獲取。
在獲取到第三方登陸用戶的信息以後,就能夠與本系統的帳戶進行匹配操做了。以後的操做存在幾種不一樣的方式類型,對於本系統來說,採用的是如下鑑定流程。
後敘
以上爲目前咱們系統中的第三方登陸的基本實現方案,也許並不太完整(畢竟基本上以前沒怎麼涉及過…),可是但願其中的涉及到的點可以幫助到你們,也但願你們能指出寫的不對的地方,並多多包涵哈。
文末也給你們,分享主要有C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK技術,面試技巧方面的資料技術討論。
感興趣的朋友能夠加羣:812855908