Android 第三方登入之新浪微博授權登入
阿新 • • 發佈:2018-11-21
Android第三方登入的優點有很多,這裡先簡單略過,後續再補充。先寫微博,其他的慢慢補充
新浪微博授權登入
主要流程如下:
這裡只是寫了一下程式的邏輯,前期的註冊申請工作可以參考官網,或者直接點這裡:新手指南
/** * 微博賬號登入授權流程 * 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====="); } }
最後,貼上第三方登入之支付寶登入,需要的朋友可以參考