Android 第三方登入之新浪微博授權登入

殘風亂了溫柔發表於2018-09-13

Android第三方登入的優點有很多,這裡先簡單略過,後續再補充。先寫微博,其他的慢慢補充

新浪微博授權登入

新浪微博開放平臺

新浪微博Android SDK

主要流程如下:

這裡只是寫了一下程式的邏輯,前期的註冊申請工作可以參考官網,或者直接點這裡:新手指南

/**
 * 微博賬號登入授權流程
 * 1.   整合SDK,修改主目錄和主模組下面的build.gradle檔案,新增微博sdk的依賴
 * 2.   建立Constants介面,定義新浪微博授權時所需要的引數(APP_KEY,REDIRECT_URL,SCOPE許可權)
 * 3.   建立微博API介面類物件 初始化WbSdk物件(在應用的Application或者呼叫SDK功能程式碼前)
 * 4.   實現WbAuthListener介面
 * 5.   呼叫方法,認證授權
 * 6.   新增SSOhandler的回撥,需要在 {@link #onActivityResult} 中呼叫 {@link SsoHandler#authorizeCallBack}
 */

下面上程式碼,先是介面

/**
 * 該介面定義了新浪微博授權時所需要的引數
 */
public interface Constants {

    /**當前該 APP 使用的 APP_KEY ,其他應用使用需要替換*/
    public static final String APP_KEY = "396518504";


    /**
     * 當前應用的回撥頁
     *
     * <p>
     * 注:關於授權回撥頁對移動客戶端應用來說對使用者是不可見的,所以定義為何種形式都將不影響,
     * 但是沒有定義將無法使用 SDK 認證登入。
     * 建議使用預設回撥頁:https://api.weibo.com/oauth2/default.html
     * </p>
     */
    public static final String REDIRECT_URL = "https://api.weibo.com/oauth2/default.html";


    /**
     * Scope 是 OAuth2.0 授權機制中 authorize 介面的一個引數。通過 Scope,平臺將開放更多的微博
     * 核心功能給開發者,同時也加強使用者隱私保護,提升了使用者體驗,使用者在新 OAuth2.0 授權頁中有權利
     * 選擇賦予應用的功能。
     *
     * 我們通過新浪微博開放平臺-->管理中心-->我的應用-->介面管理處,能看到我們目前已有哪些介面的
     * 使用許可權,高階許可權需要進行申請。
     *
     * 目前 Scope 支援傳入多個 Scope 許可權,用逗號分隔。
     *
     * 有關哪些 OpenAPI 需要許可權申請,請檢視:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI
     * 關於 Scope 概念及注意事項,請檢視:http://open.weibo.com/wiki/Scope
     */
    public static final String SCOPE =
            "email,direct_messages_read,direct_messages_write,"
                    + "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
                    + "follow_app_official_microblog," + "invitation_write";

//    public static final String SCOPE = null;  //為null時會出現沒有點選確定就自動授權成功的情況
}

然後是Activity

public class WBAuthActivity extends Activity {

    private SsoHandler ssoHandler;
    private Oauth2AccessToken mAccessToken;     // 封裝了 "uid", "access_token","expires_in","refresh_token",並提供了他們的管理功能

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        AuthInfo authInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
        WbSdk.install(this, authInfo);

        ssoHandler = new SsoHandler(WBAuthActivity.this);           //建立微博例項,認證授權

        // SSO認證授權 僅客戶端
//        ssoHandler.authorizeClientSso(new SelfWbAuthListener());
        // Web授權 沒有客戶端,網頁授權
//        ssoHandler.authorizeWeb(new SelfWbAuthListener());
        // SSO 授權+Web 授權 混合授權
        ssoHandler.authorize(new SelfWbAuthListener());

        // 從 SharedPreferences 中讀取上次已儲存好 AccessToken 等資訊,第一次啟動本,AccessToken 不可用
        mAccessToken = AccessTokenKeeper.readAccessToken(WBAuthActivity.this);
        if (mAccessToken.isSessionValid()){
            updateTokenView(true);
        }
    }

     /** 微博認證授權回撥類 */
    public class SelfWbAuthListener implements WbAuthListener{

        @Override
        public void onSuccess(final Oauth2AccessToken oauth2AccessToken) {

            WBAuthActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mAccessToken = oauth2AccessToken;
                    if (mAccessToken.isSessionValid()){
                        //顯示 mAccessToken
                        updateTokenView(false);
                        //儲存 mAccessToken 到 SharedPreferences
                        AccessTokenKeeper.writeAccessToken(WBAuthActivity.this, mAccessToken);
                        Toast.makeText(WBAuthActivity.this, "授權成功", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }

        @Override
        public void cancel() {
            Toast.makeText(WBAuthActivity.this, "取消授權", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailure(WbConnectErrorMessage wbConnectErrorMessage) {
            Toast.makeText(WBAuthActivity.this, "授權失敗:" + wbConnectErrorMessage.getErrorMessage(), Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 顯示當前 Token 資訊
     * @param hasExisted 配置檔案中是否存在 Token 資訊並且合法
     */
    public void updateTokenView(boolean hasExisted){

        String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date(mAccessToken.getExpiresTime()));
        String format = "Token:%1$s \n有效期:%2$s \nUid:%3$s";
        String message = String.format(format, mAccessToken.getToken(), date, mAccessToken.getUid());
        if (hasExisted){
            message = "Token 仍在有效期內,無需再次登入。" + "\n" + message;
        }
        Log.e("WBAuthActivity", message);
    }

    //使用者登出
    public void loginOut(){
        AccessTokenKeeper.clear(getApplicationContext());
        mAccessToken = new Oauth2AccessToken();
        updateTokenView(false);
    }

    //更新Token
    public void refreshToken(){
        if (!TextUtils.isEmpty(mAccessToken.getRefreshToken())){
            AccessTokenKeeper.refreshToken(Constants.APP_KEY, WBAuthActivity.this, new RequestListener() {
                @Override
                public void onComplete(String s) {

                }

                @Override
                public void onWeiboException(WeiboException e) {

                }
            });
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (ssoHandler != null){
            ssoHandler.authorizeCallBack(requestCode, resultCode, data);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e("WBAuthActivity", "======WBAuthActivity onDestroy=====");
    }
}

最後,貼上第三方登入之支付寶登入,需要的朋友可以參考

相關文章