在這花了大概兩天之後,我有點慌亂。儘管到目前爲止,在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");
}
您是否正在使用Google Api Java客戶端? –
我正在使用Google API第7版(Android 2.1)的庫/構建目標,這是支持AccountManager的第一個級別。這個設置與僅使用Android 2.1而不是谷歌API相互排斥。我會更新這個問題。 – user1445967