在進入主題之前,我想先解釋一下什么是“第三方登錄”。所謂的第三方登錄,就是利用用戶在第三方平台上已有的賬號來快速完成自己應用的登錄或者注冊的功能。而這里的第三方平台,一般是已經有大量用戶的平台,如國內的新浪微博、QQ空間,外國的Facebook、twitter等等。第三方登錄不是一個具體的接口,而是一種思想或者一套步驟。
要實現第三方登錄,首先你需要選擇一個第三方平台。新浪微博和QQ空間都是好的選擇,這些平台擁有大量的用戶,而且還開放了API,供我們調用接入。但是同樣開放API,微信卻不是一個好選擇,這是因為微信的API只支持分享,不支持授權驗證或者獲取用戶資料。所以要實現第三方登錄,你選擇的平台至少需要具備:
1、開放了API
2、具備獲取用戶資料或至少可以進行授權驗證
其實Share SDK已經支持了十幾種這樣子的平台,完全足夠你選擇使用。
選擇好平台以后,現在思考下面的問題:
你的應用是否具備獨立賬戶系統?
這個問題是第三方登錄時接口選擇的重要標准。如果你選擇“是”,則意味着你的應用只是需要第三方平台的用戶,而不是他們的賬戶驗證功能——也就是“要數據,不要功能”。而如果你選擇“否”,則表示你實際上是“要功能,不要數據(用戶)”。對於Share SDK來說,前者你的入口方法是showUser(null),而后者是authorize()。那么下面我分情況解釋兩種接入方式的步驟。
從簡單的說起。對於“要功能,不要數據”的情況,步驟如下:
1、用戶觸發第三方登錄事件
2、調用weibo.getDb().getWeiboId()請求用戶在此平台上的ID
3、如果用戶ID存在,則認為用戶是合法用戶,允許進入系統;否則調用authorize()
4、authorize()方法將引導用戶在授權頁面輸入帳號密碼,然后目標平台將驗證此用戶
5、如果onComplete()方法被回調,表示授權成功,引導用戶進入系統
6、否則提示錯誤,調用removeAccount()方法,刪除可能的授權緩存數據
然后是“要數據,不要功能”的步驟:
1、用戶觸發第三方登錄事件
2、showUser(null)請求授權用戶的資料(這個過程中可能涉及授權操作)
3、如果onComplete()方法被回調,將其參數Hashmap代入你應用的Login流程
4、否則提示錯誤,調用removeAccount()方法,刪除可能的授權緩存數據
5、Login時客戶端發送用戶資料中的用戶ID給服務端
6、服務端判定用戶是已注冊用戶,則引導用戶進入系統,否則返回特定錯誤碼
7、客戶端收到“未注冊用戶”錯誤碼以后,代入用戶資料到你應用的Register流程
8、Register時在用戶資料中挑選你應用的注冊所需字段,並提交服務端注冊
9、服務端完成用戶注冊,成功則反饋客戶端引導用戶進入系統
10、否則提示錯誤,調用removeAccount()方法,刪除可能的授權緩存數據
為了寫這篇文章,我自己做了一個基於Share SDK 1.2.0的Demo,選擇了新浪微博、QQ空間、Facebook和Twitter作為演示的平台。由於我沒有可以使用的服務器和賬戶系統,因此只是演示了上述的“要功能,不要數據”。但是可以很容易看出來,這種情況,其實是第二種情況的簡化,而第二種情況剩余的步驟,更多的是你應用的客戶端和服務端之間的登錄和注冊操作,和Share SDK已經沒什么關系了。