OAuth2.0協議&第三方登錄(微信,QQ,微博)

OAuth2.0協議&第三方登錄(微信,QQ,微博)

OAuth 2.0協議

1.應用場景

OAuth 2.0是一個關於授權的開放標準。
假如某個應用需要得到你的授權,如果不使用OAuth2.0協議,會要求輸入賬號密碼。這樣就帶來了一些問題:

  1. 第三方應用會保存用戶的賬戶和密碼,這樣很不安全。
  2. 用戶沒法限制第三方應用的授權範圍和有效期。
  3. 用戶只有修改密碼纔會取消授權,但這樣的話會使其他的第三方授權也失效。
  4. 如果第三方應用被破解,那麼就會導致用戶密碼泄露,和數據泄露。

使用OAuth 2.0就不會出現上述問題了。

2.OAuth思路

OAuth在"客戶端"與"服務提供商"之間,設置了一個授權層(authorization layer)。
"客戶端"不能直接登錄"服務提供商",只能登錄授權層,以此將用戶與客戶端區分開來。"客戶端"登錄授權層所用的令牌(token),與用戶的密碼不同。用戶可以在登錄的時候,指定授權層令牌的權限範圍和有效期。(一般是開發時指定scope,規定權限範圍。)
"客戶端"登錄授權層以後,"服務提供商"根據令牌的權限範圍和有效期,向"客戶端"開放用戶儲存的資料。這個令牌授權“客戶端”在特定時間內(assert_token具有有效期)訪問特定資源。這樣就恰如其分的控制了第三方應用所獲取的權限。

3.運行流程

1.打開客戶端後,客戶端要求用戶授權
2.用戶同意授權
3.客戶端使用授權,向認證服務器(第三方認證服務器)申請令牌
4.認證服務器進行認證後,同意發放令牌
5.用戶使用令牌,向資源服務器申請資源(第三方資源服務器,可以是一個服務器,也可以是兩個)
6.資源服務器確認令牌無誤,同意向客戶端開放資源

微信登錄

0.個人感覺微信登錄最大的難點在回調上,如果接收不到回調,請確認1,2兩點。並仔細檢查應用的簽名和包名,和在微信開放平臺申請時候的完全一致。
1.在AndroidManifest.xml中配置,其中Theme.NoDisplay代表透明主題。

<activity
        android:name="com.xywy.xytrain.wxapi.WXEntryActivity"
        android:exported="true"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:launchMode="singleTop"
        android:theme="@android:style/Theme.NoDisplay"
        android:screenOrientation="portrait"/>

2.在主項目跟目錄下(包名下的目錄),新建wxapi文件夾,並創建WXEntryActivity,繼承activity。必須在跟目錄下,不然無法回調。
3.微信提供了兩個回調類onReq和onResp,客戶端將消息發送的微信會回調onReq,從微信接受到消息會回調onResp。在onResp回調方法裏,可以得到ErrCode,code等參數,通過ErrCode可以判斷用戶行爲,通過Code可以換取access_token,這個code只有在ErrCode爲0時纔有效。

QQ登錄

1.QQ登錄相比較微信登錄要簡單點,初始化QQ,和IUiListener回調

 if (mTencent == null) {
        mTencent = Tencent.createInstance(MineConstants.QQAPP_ID, getContext());
    }

2.在進行登錄的activity中重寫OnActivityResult方法

      @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //一定要在與fragment綁定的activity中重寫此方法,不然無法回調
        if (requestCode == Constants.REQUEST_API ||
                requestCode == Constants.REQUEST_LOGIN) {
            Tencent.handleResultData(data, ThirdLoginFragment.mTencentListener);
        }
    }

3.IUiListener中有三個回調方法,onComplete(Object response)授權成功調用,onError(UiError e)授權失敗調用,onCancel()授權取消調用.onComplete中的response是一個JsonObject,裏面含有OpenId, AccessToken等參數,通過參數就可以取得用戶信息。
4.注意一點,QQ文檔中介紹,只需要在AndroidManifest.xml中配置

<activity
        android:name="com.tencent.tauth.AuthActivity"
        android:launchMode="singleTask"
        android:noHistory="true">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="tencent+"your appid"" />
        </intent-filter>
    </activity>

但如果使用最新的sdk還需要配置以下內容,這點在文檔中沒有介紹,走了一點彎路。

 <activity
        android:name="com.tencent.connect.common.AssistActivity"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" />

微博登錄

1.微博登錄文檔寫的比較詳細,大家看文檔就可以了。https://github.com/sinaweibosdk/weibo_android_sdk
2.注意一點,如果把第三方登錄放入子項目中,微博的jni文件需要放在main目錄下,不然會找不到jni文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章