[Android] 使用Google SDK進行SSO登入

來源:互聯網
上載者:User
1. 技術方案
    方案一,AccountPicker+GoogleAuthUtil,使用AccountPicker擷取username,使用GoogleAuthUtil擷取assess token。該方法支援單點登入,介面都是SDK裡面繪製好的,優點是方便簡單,缺點是AccountPicker不支4.2.x以下的版本。    方案二,AccountManager+ GoogleAuthUtil,使用AccountManager擷取username。AccountManager的API Level5,該方法的優點是相容性較好,缺點是需要定製一個對話方塊,來提示使用者選擇裝置上已經登入的帳號,或者建立一個帳號。    下面分別介紹這兩種方法。
2. AccountPicker+GoogleAuthUtil        API文檔    https://developer.android.com/reference/com/google/android/gms/common/AccountPicker.html 
 

    http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html


    User-Permission    <uses-permission android:name="android.permission.GET_ACCOUNTS" />    <uses-permission android:name="android.permission.NETWORK" />    <uses-permission android:name="android.permission.USE_CREDENTIALS" />    <uses-permission android:name="android.permission.INTERNET" />
    首先,調用SDK的單點登入頁面。private static final int REQ_CODE_PICK_ACCOUNT = 3333; // 數值可以自己定義哦Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[] { "com.google" }, false, null, null, null, null)    startActivityForResult(intent, REQ_CODE_PICK_ACCOUNT);    然後,得到username。protected void onActivityResult(int requestCode, int resultCode, Intent data) {    switch (requestCode) {    case REQ_CODE_PICK_ACCOUNT:    if (resultCode == RESULT_OK) { // 擷取user name成功        String name = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);  // username     } else {  // 擷取user name失敗  }     break;     ... ...}    最後,擷取token。    String token = GoogleAuthUtil.getToken(MainActivity.this, userName, "oauth2:" + scope); // 後台線程中    這一步需要注意的是scope的設定。格式為"oauth2:scope1 scope2 scope3",    https://developers.google.com/+/api/oauth        使用"https://www.googleapis.com/auth/plus.login"和"https://www.googleapis.com/auth/userinfo.email",這兩個scope即可。
3. AccountManager+ GoogleAuthUtil
    API文檔    http://developer.android.com/reference/android/accounts/AccountManager.html
    User-Permission    <uses-permission android:name="android.permission.GET_ACCOUNTS" />    <uses-permission android:name="android.permission.NETWORK" />    <uses-permission android:name="android.permission.USE_CREDENTIALS" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />    <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />    <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH.wise" />    <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH.writely" />        擷取裝置上登入的Google帳號。AccountManager manager = AccountManager.get(this);Account[] accounts = manager.getAccountsByType("com.google");    登入其他Google帳號或者建立Google帳號,並且擷取該帳號。manager.addAccount("com.google", null, null, null, this, new AccountManagerCallback<Bundle>() {    @Override    public void run(AccountManagerFuture<Bundle> future) {        if (future.isDone()) {            try {                Bundle bundle = future.getResult();                String name = bundle.getString(AccountManager.KEY_ACCOUNT_NAME);            } catch (Exeception e) {                e.printStackTrace();            }        }    }}, null);    一般,先擷取裝置上的帳號,如果裝置上只有一個帳號,那麼直接擷取該帳號的Token;如果裝置上沒有帳號,直接使用manager.addAccount添加帳號,添加成功後,擷取該帳號的Token;如果裝置上有多個帳號,那麼彈出對話方塊,可以選擇多個帳號,也可以建立新的帳號,根據使用者的選擇,做出相應的處理。
4. 驗證擷取的Token是否有效        https://www.googleapis.com/oauth2/v1/userinfo?access_token=擷取的token
  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.