5

私はアンドロイドが初めてです。OAuth2 を使用して単純なクライアント/サーバー接続を実装しようとしましたが、プロセスは次のとおりです。

  1. ClientCredentials (client_id と client_secret) を使用して OAuth2 サーバーに接続し、アクセス トークンを取得します。

  2. アクセストークンを使用してユーザーを登録します。

したがって、2 ラウンドの接続が必要です。最初のラウンドは常に問題なく、http 接続の 2 番目のラウンドは常に EOFException を返すので、かなり混乱します。関連するコードは次のとおりです (新しいスレッドで実行されるプロシージャに含まれています)。

NetHttpTransport transport = new NetHttpTransport();
JacksonFactory factory = new JacksonFactory();
//use http for testing only, will use https for deployed environment
GenericUrl url = new GenericUrl("http://192.168.x.x/oauth2/token");
//client_id & client_secret
BasicAuthentication auth = new BasicAuthentication("abc","abc");
ClientCredentialsTokenRequest token =
     new ClientCredentialsTokenRequest(transport, factory, url)
           .setClientAuthentication(auth);
TokenResponse response = token.execute();

//ok, i can get access token in response without problem

Credential credential = 
      new Credential(BearerToken.authorizationHeaderAccessMethod())
             .setFromTokenResponse(response);
//note that I reuse the transport, but using a new transport2 doesn't help
HttpRequestFactory rf = trasport.createRequestFactory(credential);
GenericData data = new GenericData();
data.put("Username",phoneText.getText().toString());
data.put("Password", passwordText.getText().toString());
JsonHttpContent content = new JsonHttpContent(factory, data);
GenericUrl genericUrl=new GenericUrl("http://192.168.x.x/users");
HttpRequest request = rf.buildPostRequest(genericUrl, content);

//the following will always return EOF exception
HttpResponse response=request.execute();

なぜそれが起こるのか、それを解決する方法を教えてもらえますか?

Google http/oauth2 API を正しく使用していますか?

どうもありがとうございました。

よろしくお願いします、

4

2 に答える 2

0

Android を使用している場合、可能であれば、Android アプリ内から OAuth ダンスを実行しようとするのではなく、Google Play ServicesのGoogleAuthUtilクラスを使用する必要があります。電話上のすべてのアカウントは事前に認証されており、合理的な理由でアクセス トークンを取得するのは非常に簡単です。

于 2013-11-11T22:10:27.820 に答える
0

汚染された接続プールに関連している可能性があります。リクエストを行う前に、キープアライブを無効にしてみてください。

System.setProperty("http.keepAlive", "false");

または、リクエストに次のヘッダーを追加することもできます。

request.addHeader("connection", "close")
于 2013-11-17T21:38:19.853 に答える