第三方登錄的定義
所謂的第三方登錄,就是利用用戶在第三方平臺上已有的賬號來快速完成自己應用的登錄或者註冊的功能。而這裏的第三方平臺,一般是已經有大量用戶的平臺,如國內的新浪微博、QQ空間,微信,外國的Facebook、twitter等等。第三方登錄不是一個具體的接口,而是一種思想或者一套步驟。
第三方登錄實現的方法
選擇好平臺以後,現在思考下面的問題:
你的應用是否具備獨立賬戶系統?
這個問題是第三方登錄時接口選擇的重要標準。如果你選擇“是”,則意味着你的應用只是需要第三方平臺的用戶,而不是他們的賬戶驗證功能——也就是“要數據,不要功能”。而如果你選擇“否”,則表示你實際上是’“要功能,不要數據(用戶)”’。對於ShareSDK來說,前者你的入口方法是showUser(null),而後者是authorize()。那麼下面我分情況解釋兩種接入方式的步驟。
①要數據,不要功能
如果你的應用擁有用戶系統,就是說你的應用自己就有註冊和登錄功能,使用第三方登錄只是爲了擁有更多用戶,那麼你可以依照下面的步驟來做:
- 用戶觸發第三方登錄事件
- showUser(null)請求授權用戶的資料(這個過程中可能涉及授權操作)
- 如果onComplete()方法被回調,將其參數Hashmap代入你應用的Login流程
- 否則提示錯誤,調用removeAccount()方法,刪除可能的授權緩存數據
- Login時客戶端發送用戶資料中的用戶ID給服務端
- 服務端判定用戶是已註冊用戶,則引導用戶進入系統,否則返回特定錯誤碼
- 客戶端收到“未註冊用戶”錯誤碼以後,代入用戶資料到你應用的Register流程
- Register時在用戶資料中挑選你應用的註冊所需字段,並提交服務端註冊
- 服務端完成用戶註冊,成功則反饋客戶端引導用戶進入系統
- 否則提示錯誤,調用removeAccount()方法,刪除可能的授權緩存數據
②要功能,不要數據
如果你的應用不具備用戶系統,而且也不打算維護這個系統,那麼你可以依照下面的步驟來做:
- 用戶觸發第三方登錄事件
- 調用platform.getDb().getUserId()請求用戶在此平臺上的ID
- 如果用戶ID存在,則認爲用戶是合法用戶,允許進入系統;否則調用authorize()
- authorize()方法將引導用戶在授權頁面輸入帳號密碼,然後目標平臺將驗證此用戶
- 如果onComplete()方法被回調,表示授權成功,引導用戶進入系統
- 否則提示錯誤,調用removeAccount()方法,刪除可能的授權緩存數據
Mob ShareSDK
關於Mob ShareSDK的介紹和集成等,最終以官方文檔爲主,多閱讀官方文檔
代碼
package com.pinkcandy.ssdzt;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import java.util.HashMap;
import java.util.Map;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.tencent.qzone.QZone;
import cn.sharesdk.wechat.friends.Wechat;
public class LoginActivity extends AppCompatActivity implements PlatformActionListener {
LinearLayout linearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
linearLayout = ((LinearLayout) findViewById(R.id.activity_main2_linearLayoutId));
initClickListener();
}
private void initClickListener() {
for (int i = 0; i < linearLayout.getChildCount(); i++) {
View view = linearLayout.getChildAt(i);
view.setTag(i);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = (int) v.getTag();
//處理事件
dealEvent(pos);
}
});
}
}
private void dealEvent(int pos) {
switch (pos) {
case 0://qq
QZone qq = new QZone(this);
login(qq);
break;
case 1://qzone
QZone qZone = new QZone(this);
login(qZone);
break;
case 2://wechat
Wechat wechat = new Wechat(this);
login(wechat);
break;
}
}
private void login(Platform platform) {
//獲取用戶信息
String userId = platform.getDb().getUserId();
if(!TextUtils.isEmpty(userId))
{
//直接跳轉到登陸成功的界面
}
else
{
//設置平臺動作監聽
platform.setPlatformActionListener(this);
//進行授權--要數據不要功能
platform.showUser(null);
//進行授權--要功能不要數據
//platform.authorize();
}
}
/**
* 成功接入
* @param platform
* @param i:接入的類型【1.要數據不要功能,2.要功能不要數據】
* @param hashMap:數據【要依賴於接入的類型】
*/
@Override
public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
if(i == Platform.ACTION_AUTHORIZING)//要功能不要數據
{
//直接跳轉到登陸成功的界面
Log.i("info","登陸成功");
}
else if(i == Platform.ACTION_USER_INFOR)//要數據不要功能
{
for (Map.Entry<String, Object> entry : hashMap.entrySet()) {
Log.i("info","key:"+entry.getKey()+"\tvalue:"+entry.getValue());
}
}
}
/**
* 登陸失敗
* @param platform
* @param i
* @param throwable:失敗的原因
*/
@Override
public void onError(Platform platform, int i, Throwable throwable) {
Log.i("info","登陸失敗");
}
/**
* 取消認證
* @param platform
* @param i
*/
@Override
public void onCancel(Platform platform, int i) {
Log.i("info","取消登陸");
}
}