0

私はリクエストを使ったプログラミングにあまり詳しくないので、できるだけ簡潔にしようと思います。問題を説明できるかもしれません。

Googleアカウントのユーザー情報を取得するために使用できる認証トークンを取得しようとしています。次の形式でトークンを取得することに成功しました:https : //oauth2-login-demo.appspot.com/oauthcallback#access_token= {accesstoken}&token_type = Bearer&expires_in = 3600

次に、このチュートリアルのTODO#11に従いました:http ://www.sw-engineering-candies.com/blog-1/howtogetuserinformationwithoauth2inagwtandgoogleappenginejavaapplication

@Override
public LoginInfo loginDetails(final String token) {
    String url = "https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=" 
        + token;

    final StringBuffer r = new StringBuffer();
    try {
        final URL u = new URL(url);
        final URLConnection uc = u.openConnection();
        final int end = 1000;
        InputStreamReader isr = null;
        BufferedReader br = null;
        try {
            isr = new InputStreamReader(uc.getInputStream());
            br = new BufferedReader(isr);
            final int chk = 0;
            while ((url = br.readLine()) != null) {
                if ((chk >= 0) && ((chk < end))) {
                    r.append(url).append('\n');
                }
            }
        } catch (final java.net.ConnectException cex) {
            r.append(cex.getMessage());
        } catch (final Exception ex) {
            log.log(Level.SEVERE, ex.getMessage());
        } finally {
            try {
                br.close();
            } catch (final Exception ex) {
                log.log(Level.SEVERE, ex.getMessage());
            }
        }
    } catch (final Exception e) {
        log.log(Level.SEVERE, e.getMessage());
    }

    final LoginInfo loginInfo = new LoginInfo();
    try {
        final JsonFactory f = new JsonFactory();
        JsonParser jp;
        jp = f.createJsonParser(r.toString());
        jp.nextToken();
        while (jp.nextToken() != JsonToken.END_OBJECT) {
            final String fieldname = jp.getCurrentName();
            jp.nextToken();
            if ("picture".equals(fieldname)) {
                loginInfo.setPictureUrl(jp.getText());
            } else if ("name".equals(fieldname)) {
                loginInfo.setName(jp.getText());
            } else if ("email".equals(fieldname)) {
                loginInfo.setEmailAddress(jp.getText());
            }
        }
    } catch (final JsonParseException e) {
        log.log(Level.SEVERE, e.getMessage());
    } catch (final IOException e) {
        log.log(Level.SEVERE, e.getMessage());
    }
    return loginInfo;
}

そのコードを実行すると、エラーが発生します。

WARNING: Authentication error: Unable to respond to any of these challenges: {googlelogin=WWW-Authenticate: GoogleLogin realm="https://www.google.com/accounts/ClientLogin", service="lso"}
{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Login Required",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Login Required"
 }
}

GWTで開発モードで実行しています。デプロイして実行しようとしましたが、エラーも発生しました。

考えられる原因は次のとおりです。1)トークンがタイムアウトしました(ただし、取得したばかりです)2)最初にデプロイする必要がありますか?3)手順が適切に行われていませんか?(トークンを取得した後、最初にそれを検証する必要がありますか?どうすればよいですか?)

ここからどうすればいいのかよくわかりません。コミュニティからの助けを得ることを望んでいます。

4

1 に答える 1

0

文字列連結エラーでした。変数が有効なトークンを保持していませんでした。

于 2012-11-27T06:19:35.570 に答える