2011-11-13 20 views
6

मैं GAE और एंड्रॉयड एक वेब सेवा के लिए किए गए एक ऐप्लिकेशन प्राप्त करने की कोशिश के साथ चारों ओर खेल रहा हूँ। मैं एंड्रॉयड पर खाता प्रबंधक से प्रमाणीकरण टोकन प्राप्त करने के लिए, कुकी हो रही, के रूप में आवश्यक तो GET अनुरोध है कि GAE अजगर आवेदन हैंडल करने के लिए है कि कुकी संलग्न चरणों के माध्यम से जा रहा हूँ। किसी कारण से जीएई आवेदन कुकी, या कुछ को पहचानने के लिए प्रतीत नहीं होता है। विशाल पद के लिए क्षमा करें, मैं सोचा मैं समझने में सहायता मिलेगी यहाँ संभव के रूप में के रूप में ज्यादा कोड प्राप्त होगा।GAE कुकी को स्वीकार करते हैं?

मैं GAE में इस बुनियादी वर्ग करता है, तो उपयोगकर्ता में मान्यता प्राप्त है परीक्षण करने के लिए है।

class TestUser(webapp.RequestHandler): 
    def get(self): 
    if users.get_current_user(): 
     self.response.out.write(users.get_current_user().nickname()) 
    else: 
     self.response.out.write('no user') 

application = webapp.WSGIApplication([ 
    ('/', MainPage), 
    ('/testuser', TestUser) 
], debug=True) 

def main(): 
    run_wsgi_app(application) 

if __name__ == '__main__': 
    main() 

ब्राउज़र से, यह बहुत अच्छा काम करता है। मैं उपयोगकर्ता को देखता हूं। एंड्रॉइड पर निष्पादन करते समय, मुझे "कोई उपयोगकर्ता नहीं" मिलता है।

onCreate:

private class GetAuthTokenTask extends AsyncTask<Account, Object, String> { 

    @Override 
    protected String doInBackground(Account... accounts) { 
     AccountManager manager = AccountManager.get(getApplicationContext()); 
     Account account = accounts[0]; 
     String token = this.buildToken(manager, account); 
     Log.d(TAG, "First token: "+token); 
     manager.invalidateAuthToken(account.type, token); 
     return this.buildToken(manager, account); 
    } 

    private String buildToken(AccountManager manager, Account account) { 
     try { 
      AccountManagerFuture<Bundle> future = manager.getAuthToken (account, "ah", false, null, null); 
      Bundle bundle = future.getResult(); 
      return bundle.getString(AccountManager.KEY_AUTHTOKEN); 
     } catch (OperationCanceledException e) { 
       Log.w(TAG, e.getMessage()); 
     } catch (AuthenticatorException e) { 
       Log.w(TAG, e.getMessage()); 
     } catch (IOException e) { 
       Log.w(TAG, e.getMessage()); 
     } 
     return null; 
    } 

    protected void onPostExecute(String authToken) { 
     Log.d(TAG, "Second token: "+authToken); 
     getCookie(authToken); 
    } 
} 

प्राप्त करें:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     cookieLength = (TextView)findViewById(R.id.cookielength); 

     cookie = "";   

     AccountManager manager = AccountManager.get(getApplicationContext()); 
     Account[] accounts = manager.getAccountsByType("com.google"); 
     new GetAuthTokenTask().execute(accounts); 
    } 

, प्रमाणीकरण टोकन प्राप्त करें यह अमान्य, और इसे फिर से पाने की अवधि समाप्त हो टोकन से बचने के लिए

यहां Android के कोड का एक समूह है वैश्विक कुकी स्ट्रिंग में संग्रहीत उपयोगकर्ता की कुकी।

private void getCookie(final String authToken) { 
    new Thread(new Runnable() { 
     public void run() { 
      String href = "https://someawesomeapp.appspot.com/_ah/login?continue=http://localhost/&auth="+authToken; 
      Log.d(TAG, "href: "+href); 

      DefaultHttpClient httpclient = new DefaultHttpClient(); 
      final HttpParams params = new BasicHttpParams(); 
      HttpClientParams.setRedirecting(params, false); 
      httpclient.setParams(params); 
      HttpGet httpget = new HttpGet(href); 
      try { 
        HttpResponse response = httpclient.execute(httpget); 
        HttpEntity entity = response.getEntity(); 
        if (entity != null) { 
         entity.consumeContent(); 
        } 
        List<Cookie> cookies = httpclient.getCookieStore().getCookies(); 
        Log.d(TAG, "Cookies"); 
        if (cookies.isEmpty()) { 
         Log.d(TAG, "None"); 
        } else { 
         for (int i = 0; i < cookies.size(); i++) { 
          Log.d(TAG, "- " + cookies.get(i).toString()); 
          Cookie c = cookies.get(i); 
          Log.d(TAG, "cookie.getname(): "+c.getName()); 
          if (c.getName().contentEquals("SACSID")) { 
           Log.d(TAG, "Found SACSID cookie"); 
           cookie = c.getValue(); 
           Log.d(TAG, "cookie now set to: "+cookie); 
          } 
         } 
        } 
       } catch (ClientProtocolException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

     } 
    }).start(); 
} 

अब हम एक कुकी संग्रहीत किया है, इंटरफ़ेस में उपयोगकर्ता दबाया टेस्ट उपयोगकर्ता बटन, इस निष्पादित होने

सार्वजनिक शून्य testuser (देखें) { Log.d (टीएजी, "testuser()");

String href = "http://someawesomeapp.appspot.com/testuser"; 


DefaultHttpClient httpclient = new DefaultHttpClient(); 
    final HttpParams params = new BasicHttpParams(); 
    HttpClientParams.setRedirecting(params, false); 
    httpclient.setParams(params); 
    HttpGet httpget = new HttpGet(href); 
    httpget.setHeader("Cookie", cookie); 
    try { 
     HttpResponse response = httpclient.execute(httpget); 
     StatusLine status = response.getStatusLine(); 
     if (status.getStatusCode() != 200) { 
      throw new IOException("Invalid response from server: " + status.toString()); 
     } 
     HttpEntity entity = response.getEntity(); 
     if (entity != null) { 
      //entity.consumeContent(); 
      InputStream inputStream = entity.getContent(); 
      ByteArrayOutputStream content = new ByteArrayOutputStream(); 

      // Read response into a buffered stream 
      int readBytes = 0; 
      byte[] sBuffer = new byte[512]; 
      while ((readBytes = inputStream.read(sBuffer)) != -1) { 
       content.write(sBuffer, 0, readBytes); 
      } 
      String dataAsString = new String(content.toByteArray()); 
      Log.d(TAG, "response: "+dataAsString); 
     } 

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

}

यहाँ WireShark से कनेक्शन की एक सूंघ गया है:

GET /testuser HTTP/1.1 
Cookie: AJKiYcEcp6zZHFUoNU5KVlEII_wcWzlBoRQpo-KQ0T_4lwoo0znXn6t7oKpmpa7ctaVY58GO5BmwxkSZ4yZ-e7EOuwTZxeGAuKwI2YrisqjnNuQB36wuzlyBfdY6c7ECcVXuu7BNYlYJtDoB7zJDUCeSXfBmGzrfSh3fHmVO56C540aRmwZKoftRB0ejkdLB6PhUGRXcBI2rbFdvKwuNKJqB0XIr8W_zcEo9AuMjBQqXkDqDUIaGn_ehKfw9c99kzw8cJNHx1EKxVL5Tc2QIYjXWnzTJAYscITCq6IiTTNSdfzWrkbK6Ys9ZOBYNqooaAOxHM5Urx7Cgg0jo2nWQ-tNyKSHfa9Ur7IxBkp137hW7Ar5pimJYb8Jd8oZGwB4uzNHV5V5yZs9aKCqXcaQoz0wgmT5FjT-zqcGz-JfMpGTeubgPg-tQjSvhwPB6mBaXWsOOyuyZPxNeFFDh51WEv53wQs_5fdTwGQ7rQ7ZTEfoBPZNA-JNfo3ecy54DQMmhflmL_IzGE__pNToBi02WlERFm0LclPXtKm4SsDXfTfMPWAve2W1wp-mP-bwB4PljC6NP98WLPWGizRw7g2NwQ_y0iWIogIq9ag 
Host: someawesomeapp.appspot.com 
Connection: Keep-Alive 

HTTP/1.1 200 OK 
Content-Type: text/html; charset=utf-8 
Cache-Control: no-cache 
Expires: Fri, 01 Jan 1990 00:00:00 GMT 
Vary: Accept-Encoding 
Date: Sun, 13 Nov 2011 17:42:34 GMT 
Server: Google Frontend 
Transfer-Encoding: chunked 

7 
no user 
0 

यहाँ प्रतिक्रिया GAE से "कोई उपयोगकर्ता" है। GAE को उपयोगकर्ता के रूप में कुकी पर स्वीकार करने और कार्य करने के तरीके के बारे में कोई विचार?

27 सेकंड बाद, मुझे लगता है कि मैं एक मुद्दा मिल गया। यहां ब्राउज़र से एक स्नीफ है, मेरे पास यह ACSID = भाग नहीं है।

Cookie: ACSID=AJKiYcFeUHZUP56a 

आपकी मदद के लिए धन्यवाद!
स्टेटफुल

संपादित करें: मुझे यह ठीक हो गया है। मुझे अपने खुद के प्रश्न का उत्तर देने के लिए थोड़ी देर इंतजार करना है, हालांकि पर्याप्त प्रतिष्ठा नहीं है। असल में, चूंकि मुझे एसएसएल के साथ कुकी मिल रही है, इसलिए कुकी को एसीएसआईडी की बजाय एसएसीएसआईडी के साथ प्रीफिक्स किया जाना चाहिए और टेस्टसर यूआरएल को भी https होना चाहिए क्योंकि वह कुकी है जिसका हम उपयोग कर रहे हैं।

उत्तर

2

मुझे यह तय हो गया। किसी और के लिए अपने बालों को खींचने के लिए:

जब आप एसएसएल का उपयोग कर कुकी प्राप्त करने के अनुरोध को भेजते हैं तो प्रतिक्रिया एसएसीएसआईडी के साथ प्रीफ़िक्स की जाएगी, अगर नहीं तो यह ACSID होगा।

HTTP अनुरोध पर

मैं कुकी अलावा बदल दिया है:

httpget.setHeader("Cookie", "SACSID="+cookie); 

और यह भी, के बाद से है कि एस कुकी है, मैं इस तरह के रूप SSL के माध्यम से अनुरोध भेजने के लिए है:

संबंधित मुद्दे