【问题标题】:CircularRedirectException with google authentication带有谷歌身份验证的 CircularRedirectException
【发布时间】:2011-08-15 07:40:03
【问题描述】:

我正在尝试在 youtube 中显示用户的收藏视频列表。所以基本上在获取视频提要之前,我需要登录以获取身份验证令牌。我遇到了一些关于 cookie 的问题。这是我的日志记录代码:

public static String loginUser(String username, String password){

        Log.i("Utils", "Start logging user");
        // Create a new HttpClient and Post Header  
        DefaultHttpClient httpclient = new DefaultHttpClient();
        CookieStore cookieStore = new BasicCookieStore();
        HttpContext localContext = new BasicHttpContext();
        // Bind custom cookie store to the local context
        localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

        HttpPost httppost = new HttpPost("https://www.google.com/youtube/accounts/ClientLogin");  
        httppost.addHeader("Content-Type","application/x-www-form-urlencoded");

        String result = "";
        try {  
            // Add your data  
            StringEntity tmp = 
                new StringEntity("Email="+ username +"&Passwd="+ password +"&service=youtube&source=speed bit", "UTF-8"); 
            httppost.setEntity(tmp);  

            // Execute HTTP Post Request  
            HttpResponse response = httpclient.execute(httppost, localContext);  
            result = EntityUtils.toString(response.getEntity());

         } catch (ClientProtocolException e) {  
                // TODO Auto-generated catch block  
         } catch (IOException e) {  
                // TODO Auto-generated catch block  
         }  
         finally{
                //httpclient.close();

         }

        Log.i("Utils", "End logging user");


         if (result.equals(""))
             return result;

         String []firstArr = result.split("YouTubeUser");
         String []secondArr = firstArr[0].split("=");
         result = secondArr[1];

         return result;
     }

在我得到授权令牌后,我得到了视频:

String urlFeed = params[0];
                    String auth = params[1];
                    InputStream in;
                    HttpGet get = new HttpGet(urlFeed);

                    if (auth != null){

                        get.setHeader("Authorization","GoogleLogin auth="+auth);
                        get.setHeader("X-GData-Key",
                        "key=AI39si5t8eJE_CVcakc-Hzs8wroPcsOHi_fqT03SG6f_lGrJsku0xyfPyB1qZlmYtN5cflfcYAgmvMF2QLy3uG1F6sy-cRzwdg");
                    }

                    HttpResponse resp = null;



                    try {
                        DefaultHttpClient httpClient = new DefaultHttpClient();
                        CookieStore cookieStore = new BasicCookieStore();
                        HttpContext localContext = new BasicHttpContext();
                        // Bind custom cookie store to the local context
                        localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
                        resp = httpClient.execute(get, localContext);
                    } catch (ClientProtocolException e) {
                        Log.e(getClass().getSimpleName(), "HTTP protocol error", e);
                    } catch (IOException e) {

                        Log.e(getClass().getSimpleName(), "Communication error", e);
                    }

首先它在 logcat 中呈现这个东西:

08-15 00:21:36.048: WARN/ResponseProcessCookies(4324): Cookie rejected: "BasicClientCookie[version=0,name=PREF,domain=.google.com,path=/,expiry=Wed Aug 14 00:21:36 GMT+02:00 2013]". Illegal domain attribute "google.com". Domain of origin: "www.google.co.il"

然后它在resp = httpClient.execute(get, localContext); 上崩溃 这里是 logcat:

08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324): HTTP protocol error
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324): org.apache.http.client.ClientProtocolException
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:557)
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at com.android.mytubedownloader.BaseActivity$YoutubeFeedTask.doInBackground(BaseActivity.java:551)
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at com.android.mytubedownloader.BaseActivity$YoutubeFeedTask.doInBackground(BaseActivity.java:1)
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at java.lang.Thread.run(Thread.java:1019)
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324): Caused by: org.apache.http.client.CircularRedirectException: Circular redirect to 'http://www.google.co.il/'
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at org.apache.http.impl.client.DefaultRedirectHandler.getLocationURI(DefaultRedirectHandler.java:173)
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at org.apache.http.impl.client.DefaultRequestDirector.handleResponse(DefaultRequestDirector.java:903)
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:468)
08-15 00:21:36.058: ERROR/YoutubeFeedTask(4324):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)

【问题讨论】:

    标签: java android login youtube gdata-api


    【解决方案1】:

    每当我收到 HTTP 协议错误时,都是因为安全问题。你可以试试HttpPost httppost = new HttpPost("**http**://www.google.com/youtube/accounts/ClientLogin");

    并从 https 中删除 s。这通常会让我的问题消失。

    祝你好运!

    【讨论】:

      【解决方案2】:

      我不确定这是否是全部原因,但this document 表示该 URL 已被弃用。希望能有所帮助。

      此网址于 2010 年 10 月更新。根据我们的服务条款中说明的政策,旧网址已被弃用。如果您要更新使用旧 URL (https://www.google.com/youtube/accounts/ClientLogin) 的应用程序,请注意新 URL 不会将用户的 YouTube 帐户名称作为 YouTubeUser 值返回以响应成功的 ClientLogin 请求。

      【讨论】:

        【解决方案3】:

        您不应通过网站 URL 访问 Youtube。官方获取视频的方式是Youtube Data API

        【讨论】:

          猜你喜欢
          • 2012-09-20
          • 2020-08-15
          • 2018-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-20
          • 2014-05-08
          相关资源
          最近更新 更多