2012-06-09 61 views
3

在這花了大概兩天之後,我有點慌亂。儘管到目前爲止,在OpenID上選擇了OAuth2之後,我對Authenticate和Authorize之間的區別非常熟悉。Android AccountManager,Oauth,getAccessToken()除了要求輸入密碼之外什麼都不做

我想我的android應用程序提供幾種方法來驗證用戶,其中之一是谷歌帳戶,以及以後還有Facebook和Twitter帳戶。我試圖使用AccountManager類來獲取OAuth訪問令牌(現在)只需驗證用戶的電子郵件地址。目標是,如果用戶已經有一個谷歌帳戶保存在Android設備上,他們可以授權我的應用程序一次,MAYBE即使不輸入密碼,也不必再從他們的Android登錄。

我決定使用Google自己的AccountManager,因爲它承諾可以在Android框架中處理大部分本地內容,而無需打開瀏覽器窗口。我正在使用Google API版本7(Android 2.1)的庫/構建目標,這是支持AccountManager的第一個級別。

我已經嘗試了這兩種不同的方式,一種是使用AccountManager.getAuthTokenByFeatures()(其中不指定Account對象),另一種使用getAuthToken()來指定此類對象。

在每種情況下,調用完成(如我所期望的),應用程序顯示一個授權對話框,詢問我是否要授權該應用程序。到現在爲止還挺好。如果我拒絕,程序會拋出我期望的異常。如果我接受,會出現一個「Google登錄」對話框,詢問我是否要爲該帳戶輸入密碼。請注意,當我將帳戶添加到設備時,我已經輸入了密碼。如果我在對話框中輸入密碼,則會出現「授權」等待屏幕,然後再次出現相同的對話框。奇怪的是,如果我輸入正確的密碼,「授權」等待屏幕似乎需要更長一點時間。所以看起來,我無法到達我成功獲取令牌的代碼路徑。

儘管發泄不了谷歌,但並不清楚AUTH_TOKEN_TYPE是什麼,或者userinfo.email URL沒有記錄,但我真的很想知道我在這裏做錯了什麼,然後移過去。

這是我的代碼,我會監控這個,當然很樂意回答任何問題。現在我正在努力捕獲網絡流量,看看是否能夠提供進一步的洞察。

以下是顯示身份驗證屏幕(OK)和密碼對話框(少OK) http://imageshack.us/g/707/device20120609020618.png/

public void loginToGoogle() { 
    System.out.println("Starting"); 
    AccountManagerFuture<Bundle> bundleFuture = 
     AccountManager.get(_activity).getAuthTokenByFeatures(
       "com.google", 
       "https://www.googleapis.com/auth/userinfo.email", 
       null, 
       _activity, 
       null, 
       null, 
       new AccountManagerCallback<Bundle>() { 

         public void run(AccountManagerFuture<Bundle> future) { 
         Bundle bundle; 
         try { 
          bundle = future.getResult(); 
          for (String s : bundle.keySet()) { 
           System.out.println("Found key: "+ s); 
          } 

          System.out.println(bundle.getString(AccountManager.KEY_ACCOUNT_NAME)); 
          System.out.println(bundle.getString(AccountManager.KEY_AUTHTOKEN)); 
          //Use Token 


         } catch (OperationCanceledException e) { 
          Log.e("e", e.getMessage(), e); 
          System.out.println("User appears to have denied auth request"); 
         } catch (AuthenticatorException e) { 
          Log.e("e", e.getMessage(), e); 
         } catch (IOException e) { 
          Log.e("e", e.getMessage(), e); 
         } 
         } 
        }, 
        null); 
    System.out.println("Done with AccountManager call"); 
} 
+0

您是否正在使用Google Api Java客戶端? –

+0

我正在使用Google API第7版(Android 2.1)的庫/構建目標,這是支持AccountManager的第一個級別。這個設置與僅使用Android 2.1而不是谷歌API相互排斥。我會更新這個問題。 – user1445967

回答

3

您的問題最有可能出在身份驗證令牌類型傳遞到getAuthTokenByFeatures圖像。由於您使用的oauth2,你需要把它添加到您的認證類型的開頭:

String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/userinfo.email" 

不過,我還不能肯定你要使用的身份驗證令牌類型是有效的。我只是自己處理日曆和任務。希望這可以解決,如果沒有,只是讓我知道,我會找到你正確的身份驗證類型

+1

我剛插入它並工作。你是我的英雄。我記得在其他地方看到了oauth2:notation,但是即使當我去'Oauth2 Playground'(一個很好的工具)https://code.google。com/oauthplayground唯一的問題是,這個Auth類型沒有適當的'別名',也就是說,用戶被問到是否允許應用程序「oauth2:https:// ...」。你碰巧知道這是否有別名?即如果您插入了「管理您的任務」,則它適用於任務API – user1445967

+0

據我所知,您不能。我相信我在某處讀到他們正在致力於更新這一點。 –

+0

你們是我的英雄,我一直試圖弄清這個問題的時間最長,而Google並不容易。我確實有一個後續問題。有沒有辦法在訪問請求窗口中設置更加用戶友好的消息,而不是要求訪問oauth2的權限:https://www.googleapis.com/auth/userinfo.email或在我的情況下oauth2:https ://www.googleapis.com/auth/calendar,您可以將其設置爲顯示「您的日曆」之類的內容? – azrosen92

相關問題