2013-08-09 8 views
3

Хорошо, я сдаюсь. У кого-нибудь есть опыт использования Google IssueAuthToken и MergeSession для аутентификации с определенными службами Google, у которых нет официального доступа к API? В этом случае я пытаюсь получить закладки Google (с google.com/bookmarks).Android: Google Authentication + Ubertoken

Я получаю SID и LSID, используя getAuthToken, и это работает нормально. Затем я звоню

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 и где все это идет не так:

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 я не вижу дополнительных куки я должен видеть, и я также вижу такие вещи, как X-Frame-Options: DENY ,

Справка (пожалуйста)!

ответ

0

Хорошо, друзья, мы идем. Похоже, что вышеизложенное сейчас ненадежно/сломано, по крайней мере, по состоянию на август 2013 года. Вот как я это делаю сейчас и, похоже, работает. Сначала он пытается вышесказанное, и если он терпит неудачу, переходит к методу # 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);