2

기본적으로이 게시물을 따라 앱 엔진 서버에 대한 android 앱 인증을하고 있습니다 : http://blog.notdot.net/2010/05/Authenticating-against-App-Engine-from-an-Android-app.앱 엔진 서버에 대한 android 요청이 실패했습니다 (401)

프로세스가 끝날 때 얻은 쿠키가 좋지 않은 것으로 보입니다. 401이 생기므로 쿠키를 복사하고 브라우저에서 테스트하고 401을 얻으려고했습니다. 브라우저를 복사 할 때 쿠키를 Android 앱에 전송하면 요청이 작동합니다.

어떻게 잘못된 쿠키를 가져올 수 있습니까? 심지어 토큰을 무효화하려고 시도했지만 여전히 동일한 결과를 얻었습니다 ...

답변

2

을 읽고 도움이 될 것입니다 : 나는 다음을 다시 변경, https에서 http로 초기 쿠키 요청에 대한 URL을 변경했습니다.

결국에는 구현을 변경하고 alistair가 제안한대로 loopj으로 이동하기로 결정했습니다. 결과는 훨씬 더 우아합니다.

public class AccountList extends ListActivity { 
    protected AccountManager accountManager; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     accountManager = AccountManager.get(getApplicationContext()); 
     Account[] accounts = accountManager.getAccountsByType("com.google"); 
     this.setListAdapter(new ArrayAdapter<Account>(this, R.layout.list_item, accounts)); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     Account account = (Account)getListView().getItemAtPosition(position); 
     accountManager.invalidateAuthToken("com.google", null); 
     accountManager.getAuthToken(account, "ah", null, this, new GetAuthTokenCallback(), null); 
    } 

    private class GetAuthTokenCallback implements AccountManagerCallback<Bundle> { 
     public void run(AccountManagerFuture<Bundle> result) { 
      AsyncHttpClient client = new AsyncHttpClient(); 
      PersistentCookieStore myCookieStore = new PersistentCookieStore(getBaseContext()); 
      client.setCookieStore(myCookieStore); 
      try { 
       Bundle bundle; 
       bundle = result.getResult(); 
       Intent intent = (Intent)bundle.get(AccountManager.KEY_INTENT); 
       if(intent != null) { 
        // User input required 
        startActivity(intent); 
       } else { 
        String token = bundle.getString(AccountManager.KEY_AUTHTOKEN); 
        String url = "http://myapp.appspot.com/_ah/login?continue=http://localhost/&auth=" + token; 
        client.post(url, new AsyncHttpResponseHandler()); 
        Intent backToMainActivity = new Intent(getApplicationContext(), MainActivity.class); 
        startActivity(backToMainActivity); 
       } 
      } catch (OperationCanceledException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (AuthenticatorException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

loopj는 영구 쿠키의 저장 공간을 제공하기 때문에

, 나는 다른 활동에 할 일은 초기화하는 것입니다 : 이것은 내 로그인 활동 (내가 loopj API에 의해 주어진 영구 쿠키의 저장 장치에 클라이언트를 연결하고있어주의)이다 클라이언트에 저장하고 영구 쿠키 저장소에 연결합니다. 이렇게하면 로그인 활동에서 얻은 모든 쿠키가 새 클라이언트에 제공됩니다.

AsyncHttpClient client = new AsyncHttpClient(); 
client.setCookieStore(new PersistentCookieStore(this)); 

이 BTW &가 참고 : :이 loopj 라이브러리가 쿠키를 저장하기 위해 SharedPreferences API를 사용하며 PersistentCookieStore으로 잘 감싸고 초기화는 다음과 같이 보인다.

+0

내 대답이 실제로 맞았습니까? – alistair

+0

네, 정확한 위치로 정확히 지적했는데, 그 이유는 제가 업 그레 이드 된 이유입니다. 약간 설명이 부족했습니다. – Uri

2

직접이 작업을 수행하지 마십시오. 이것을 사용하십시오 : http://loopj.com/android-async-http/

+0

이 라이브러리는 앱 엔진 쿠키를 얻을 수 있습니까? 코드 예제를 보여줄 수 있습니까? 그것은 문서에 의해 그렇게 보이지 않습니다. – Uri

0

당신이 사용하는 httpclient를 모릅니다.

어쩌면 아파치 docs on cookies ...이 일을 몇 가지 이유를 들어

+0

'DefaultHttpClient client = new DefaultHttpClient();'를 사용하고 있습니다. 하지만 내 편집을보고, 문제는 쿠키가 처음부터 유효하지 않다는 것입니다. 그래서 제가 401을 얻는 것입니다. – Uri

관련 문제