Android:Google身份验证+ Ubertoken

时间:2013-08-09 18:43:52

标签: android authentication oauth

好的,我放弃了。任何人都有使用Google的IssueAuthToken和MergeSession来验证某些没有官方API访问权限的Google服务的经验吗?在这种情况下,我正在尝试获取Google书签(来自google.com/bookmarks)。

我使用getAuthToken获取SID和LSID,并且工作正常。然后我打电话给

Uri ISSUE_AUTH_TOKEN_URL = Uri.parse("https://accounts.google.com/IssueAuthToken?service=bookmarks&Session=false");

String url = ISSUE_AUTH_TOKEN_URL.buildUpon()
                 .appendQueryParameter("SID", sid)
                 .appendQueryParameter("LSID", lsid)
                 .build().toString();

我收到了“ubertoken”。

然后我对MergeSession进行GET,这就是出错的地方:

String url2 = "https://accounts.google.com/MergeSession?source=chrome&uberauth="+uberToken+"&service=bookmarks&continue=https%3A%2F%2Fwww.google.com%2Fbookmarks%2F";
HttpGet getCookies = new HttpGet(url2);

浏览getCookies的标题我没看到我应该看到的额外Cookie,我也看到X-Frame-Options: DENY之类的内容。

帮助(请)!

1 个答案:

答案 0 :(得分:0)

好的朋友,我们走了。看起来上面现在至少偶尔会在2013年8月不可靠/破坏。这就是我现在正在做的事情,它似乎有效。它首先尝试上述内容,如果失败,则继续执行方法#2。

  final Account acct = am.getAccountsByType("com.google")[acctid];
  final String tokenType = "weblogin:service=bookmarks&continue=https://www.google.com/bookmarks/";

    am.getAuthToken(acct, tokenType, null, this, new AccountManagerCallback<Bundle>() {
        @Override
        public void run(AccountManagerFuture<Bundle> future) {
            try {
                final String accessToken = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
                if (accessToken.contains("WILL_NOT_SIGN_IN")) {
                    am.getAuthToken(acct, "SID", null, MainActivity.this, new AccountManagerCallback<Bundle>() {
                        @Override
                        public void run(AccountManagerFuture<Bundle> future) {
                            try {
                                sid = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
                            } catch (OperationCanceledException e) {
                                finish();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }

                            am.getAuthToken(acct, "LSID", null, MainActivity.this, new AccountManagerCallback<Bundle>() {
                                @Override
                                public void run(AccountManagerFuture<Bundle> future) {
                                    try {
                                        lsid = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
                                    } catch (OperationCanceledException e) {
                                        finish();
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }

                                    Thread t = new Thread() {
                                        public void run() {
                                            try {
                                                Uri ISSUE_AUTH_TOKEN_URL = Uri.parse("https://www.google.com/accounts/IssueAuthToken?service=gaia&Session=false");
                                                Uri TOKEN_AUTH_URL = Uri.parse("https://www.google.com/accounts/TokenAuth");

                                                final HttpClient httpclient = new DefaultHttpClient();
                                                httpclient.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
                                                httpclient.getParams().setBooleanParameter(ClientPNames.HANDLE_REDIRECTS, true);

                                                String url = ISSUE_AUTH_TOKEN_URL.buildUpon().appendQueryParameter("SID", sid).appendQueryParameter("LSID", lsid).build().toString();
                                                HttpPost getUberToken = new HttpPost(url);
                                                HttpResponse response = httpclient.execute(getUberToken);

                                                String uberToken = EntityUtils.toString(response.getEntity(), "UTF-8");

                                                final String accessToken2 = TOKEN_AUTH_URL.buildUpon()
                                                        .appendQueryParameter("source", "android-browser")
                                                        .appendQueryParameter("auth", uberToken)
                                                        .appendQueryParameter("continue", "https://www.google.com/bookmarks/").build().toString();

                                                //do stuff
                                            } catch (Exception e) {
                                                e.printStackTrace();
                                            }
                                        }
                                    };
                                    t.start();
                                }
                            }, null);
                        }
                    }, null);
                } else {             
                    //do stuff
                }
            } catch (OperationCanceledException e) {
                finish();
            } catch (Exception e) {
                finish();                 
            }
        }
    }, null);