Android AccountManager,Oauth,getAccessToken()除了要求输入密码外什么都不做

时间:2012-06-09 09:15:27

标签: android oauth google-api

在这花了大约两天后,我有点慌乱。虽然到目前为止,在OpenID上选择了OAuth2,但我非常精通Authenticate和Authorize之间的区别。

我希望我的Android应用提供多种方式来验证用户,其中一种是谷歌帐户,后来还有Facebook和Twitter帐户。我正在尝试使用AccountManager类来获取OAuth访问令牌(现在)只是验证用户的电子邮件地址。目标是,如果用户已经在Android设备上保存了一个谷歌帐户,他们可以一次授权我的应用程序,甚至可以不输入密码,也不必再次从他们的Android登录。

我决定使用Google自己的AccountManager,因为它承诺在Android框架中本地处理大部分内容,甚至不打开浏览器窗口。我正在使用谷歌API版本7(Android 2.1)的库/构建目标,这是支持AccountManager的第一个级别。

我尝试了这两种不同的方法,一种是使用AccountManager.getAuthTokenByFeatures(),其中没有指定Account对象,另一种使用getAuthToken(),您指定了这样的对象。

在每种情况下,调用都会完成(我希望如此),并且应用程序会显示一个授权对话框,询问我是否要授权该应用。到现在为止还挺好。如果我拒绝,程序会抛出我期望的异常。如果我接受,则会出现“Google登录”对话框,询问我该帐户的密码。请注意,我已将帐户添加到设备时输入了密码。如果我在对话框中键入密码,则会出现“授权”等待屏幕,然后重新出现相同的对话框。奇怪的是,如果输入CORRECT密码,“授权”等待屏幕似乎需要更长的时间。所以我似乎无法进入成功获取令牌的代码路径。

由于发泄谷歌不清楚AUTH_TOKEN_TYPE是什么或者userinfo.email网址没有记录的事实,我真的很想知道我在这里做错了什么并且过去了。< / p>

这是我的代码,我将对此进行监控,当然很乐意回答任何问题。现在我将开始捕获网络流量,看看是否可以进一步了解出现了什么问题。

以下是显示身份验证屏幕(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");
}

1 个答案:

答案 0 :(得分:3)

您的问题很可能在于您传递给getAuthTokenByFeatures的Auth令牌类型。由于您使用的是oauth2,因此需要将其添加到auth类型的开头:

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

但是,我并不认为您尝试使用的Auth令牌类型有效。我自己只处理过日历和任务。希望这可以解决,如果没有,请告诉我,我会找到你正确的Auth类型